我已经通过完全从域对象外部化它来实现这种关系。
示例(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
}
}
我有点担心性能,但因为我只希望使用小型数据集,所以它不应该是一个主要问题。如果没有指标,我还不会优化!
但是有更好的解决方案吗?