我有一个名为AssociatedDocuments
的M-N联接表,看起来有点像这样:
|------------|----------|------------|
| RecordType | RecordId | DocumentId |
|------------|----------|------------|
| ITEM | 1 | 5 |
| ITEM | 2 | 2 |
| WORKORDER | 5 | 2 |
|------------|----------|------------|
在@ManyToAny
关系的一端,我有一组多态实体,其中两个是Item
和WorkOrder
。其中每个都可以与Document
相关联。
在Document
方面,我的实体中有以下方法:
@ManyToAny(metaColumn = @Column(name = "RecordType"))
@AnyMetaDef(
idType = "integer", metaType = "string",
metaValues = {
@MetaValue(targetEntity = Item.class, value = "ITEM"),
@MetaValue(targetEntity = WorkOrder.class, value = "WORKORDER")
})
@JoinTable(name = "AssociatedDocuments",
joinColumns = {@JoinColumn(name = "DocumentId")},
inverseJoinColumns = {@JoinColumn(name = "RecordId")})
public Set<HasDocumensAndUrls> getAssociatedEntities() {
return associatedEntities;
}
例如,如果我目前正在使用ID为 2 的Document
,我会收到一个包含两个项目的集合:一个带有Item
个实例,另一个带有另一个使用WorkOrder
实例。当我将项目添加到此集合并通过Hibernate持久化时,AssociatedDocuments
表中的新条目将自动添加给我。
我需要的是一种从关系的另一端开始工作的方法。目前,我在@ManyToMany
和Item
上都定义了WorkOrder
关系,使用@WhereJoinTable
过滤结果,如下所示:
@Override
@ManyToMany
@Cascade({PERSIST, MERGE, SAVE_UPDATE})
@JoinTable(name = "AssociatedDocuments",
joinColumns = {@JoinColumn(name = "RecordId")},
inverseJoinColumns = {@JoinColumn(name = "DocumentId")})
@WhereJoinTable(clause = "RecordType = 'WORKORDER'")
public Set<Document> getDocuments() {
return this.documents;
}
这适用于检索现有记录,但由于Document
列,我无法向集合添加新的RecordType
实例以使其创建关系。我知道@SQLInsert
,但这感觉就像是实现解决方案的黑客手段,因为我必须有效地猜测@SQLInsert
子句的参数顺序。
有没有一种正确的解决方法,我不知道,或者我是否需要在我的@SQLInsert
关系中使用@ManyToMany
注释?
出于参考目的,我的WorkOrder
实体被定义为(项目类似):
@Entity
@Table(name = "WorkOrders")
public class WorkOrder implements HasDocumensAndUrls { ... }
和Document
如下:
@Entity
@Table(name = "Documents")
public class Document { ... }