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
}
}