Java 如何在Hibernate中创建多态/通用多对多关系?

Java 如何在Hibernate中创建多态/通用多对多关系?,java,hibernate,associations,Java,Hibernate,Associations,我想创建一个通用的多对多关系(列表) 使用以下示例域: +-------+ +----------+ +-----------+ | Issue | | Web Page | | Wiki Page | +-------+ +----------+ +-----------+ 我想创建一个像下面这样的通用链接关联,其中from和to可以是上面的任何域对象 +---------------------+ | Link | +---------------

我想创建一个通用的多对多关系(列表)

使用以下示例域:

+-------+  +----------+ +-----------+
| Issue |  | Web Page | | Wiki Page |  
+-------+  +----------+ +-----------+
我想创建一个像下面这样的通用链接关联,其中
from
to
可以是上面的任何域对象

+---------------------+ 
| Link                |
+---------------------+ 
| Object: from        |
| Object: to          |
| String: description |
+---------------------+ 
因此,
问题
有许多
链接
,其中问题位于关系的一侧

我设想使用如下所示的链接表:

Link Table
| ID | SRC_ID | SRC_CLASS | DEST_ID | DESC_CLASS |
因此,
SRC_ID
DEST_ID
是相应表中的外键


链接表的映射应该是什么样子?

Hibernate
中,您不应该从
实体
类手动创建表。只需将注释
@manytomy
放到pojo中,hibernate就会生成数据库的模式,以及与相关表的所有外键关系

休眠多对多单向映射应如下所示:

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

@Entity
class Link{
}
@实体
班级问题{
@许多
列出链接;
}
@实体
类链接{
}

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

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

示例(Groovy+Grails)

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

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
  }

}
import org.springframework.transaction.annotation.Transactional
类可链接服务{
@交易的
公共无效链接(对象src、对象dest、字符串描述){
链接=新链接(src、dest、说明)
link.save()
}
@事务(只读=真)
公共收集链接(对象-主题){
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(fromLinks)
allLinks.addAll(toLinks)
返回所有链接
}
}
我有点担心性能,但因为我只希望使用小数据集,所以它不应该是一个大问题。如果没有指标,我还不会优化


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

是的,我了解所有这些-但是添加表结构示例的原因是为了让您了解我在寻找什么。由于关系的
端可以是多种类型,因此我不确定如何对链接本身进行编码
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
  }

}