我想创建一个通用的多对多关系(List)。
使用以下示例域:
+-------+ +----------+ +-----------+
| Issue | | Web Page | | Wiki Page |
+-------+ +----------+ +-----------+
我想要创建一个如下所示的通用链接关联,其中from
和to
可能是上面的任何域对象。
+---------------------+
| Link |
+---------------------+
| Object: from |
| Object: to |
| String: description |
+---------------------+
所以Issue
有很多Link
,问题出在关系的一边。
我设想使用类似于以下内容的链接表:
Link Table
| ID | SRC_ID | SRC_CLASS | DEST_ID | DESC_CLASS |
因此SRC_ID
和DEST_ID
是相应表中的外键。
Link表的映射应该是什么样的?
答案 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
}
}
我对性能有点担心,但由于我只希望使用小型数据集,因此它不应该是一个主要问题。如果没有指标,我还不会优化!
但是有更好的解决方案吗?