在Hibernate中创建双向@ManyToAny关系?

时间:2016-04-28 12:34:48

标签: java hibernate

我有一个名为AssociatedDocuments的M-N联接表,看起来有点像这样:

|------------|----------|------------|
| RecordType | RecordId | DocumentId |
|------------|----------|------------|
|   ITEM     |     1    |      5     |
|   ITEM     |     2    |      2     |
| WORKORDER  |     5    |      2     |
|------------|----------|------------|

@ManyToAny关系的一端,我有一组多态实体,其中两个是ItemWorkOrder。其中每个都可以与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表中的新条目将自动添加给我。

我需要的是一种从关系的另一端开始工作的方法。目前,我在@ManyToManyItem上都定义了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 { ... }

0 个答案:

没有答案