如何在Hibernate中创建多态/泛型多对多关系?

时间:2013-09-29 06:18:08

标签: java hibernate associations

我想创建一个通用的多对多关系(List)。

使用以下示例域:

+-------+  +----------+ +-----------+
| Issue |  | Web Page | | Wiki Page |  
+-------+  +----------+ +-----------+

我想要创建一个如下所示的通用链接关联,其中fromto可能是上面的任何域对象。

+---------------------+ 
| Link                |
+---------------------+ 
| Object: from        |
| Object: to          |
| String: description |
+---------------------+ 

所以Issue有很多Link,问题出在关系的一边。

我设想使用类似于以下内容的链接表:

Link Table
| ID | SRC_ID | SRC_CLASS | DEST_ID | DESC_CLASS |

因此SRC_IDDEST_ID是相应表中的外键。

Link表的映射应该是什么样的?

2 个答案:

答案 0 :(得分:0)

Hibernate中,您不应该从Entity课程手动创建表格。只需将注释@ManyToMany放到pojo中,hibernate将生成数据库的模式,其中包含与相关表的所有外键关系。

Hibernate多对多单向映射应该像:

@Entity
class Issue{
  @ManyToMany
  List<Link> links;
}

@Entity
class Link{
}

如果您的应用程序是Java SE,则使用类SchemaExport在数据库中生成模式。

答案 1 :(得分:0)

我通过完全从域对象外部化来实现这种关系。

示例(Groovy + Grails)

class Link{
   String fromClass
   long fromId
   String toClass
   long toId
   String description

   Link(){}
   Link(Object src, Object dest, String descrption){
      fromClass=src.class.name
      fromId=src.id
      toClass=dest.class.name
      toId=dest.id
      this.description=description
   }

   Object getFrom(){
      // Invoke GORM static finder
      Class.forName(fromClass)."get"(fromId)
   }

   Object getTo(){
      // Invoke GORM static finder
      Class.forName(toClass)."get"(toId)
   }
}

使用关联的服务层来创建/检索对象:

import org.springframework.transaction.annotation.Transactional
class LinkableService {
  @Transactional
  public void link(Object src, Object dest, String description){
    Link link = new Link(src,dest,description)
    link.save()
  }

  @Transactional(readOnly=true)
  public Collection<Link> links(Object subject){
    def fromLinks = Link.findAllWhere(fromClass:subject.class.name, fromId:subject.id)
    def toLinks = Link.findAllWhere(toClass:subject.class.name, toId:subject.id)
    def allLinks = new ArrayList<Link>(fromLinks)
    allLinks.addAll(toLinks)
    return allLinks
  }

}

我对性能有点担心,但由于我只希望使用小型数据集,因此它不应该是一个主要问题。如果没有指标,我还不会优化!

但是有更好的解决方案吗?