Hibernate Annotations:使用在PK中具有公共属性的Join表的多对多关系

时间:2017-03-17 03:32:10

标签: many-to-many hibernate-mapping hibernate-annotations

是否可以使用具有复合键的连接表在两个表之间定义多对多关系,在两个表之间具有公共属性?

假设我们有一个如下所示的表结构,并尝试使用kit_business_product表定义kit和business_product之间的关联。以下是表定义(针对此问题进行了简化)。

表1:套件

PK1:kit_id,business_id

表2(加入表):kit_business_product

PK2:kit_id,business_id,manufacturer_id,product_id,name

表3:business_product

PK3:business_id,manufacturer_id,product_id,name

以下是这些表的java类(针对此问题进行了简化)。

Kit.java

@Entity
@Table (name= "kit")
public class Kit
{
    @EmbeddedId
    private KitId id;

    @ManyToMany
    @JoinTable(name = "kit_business_product",
    joinColumns = {@JoinColumn(name = "kit_id", referencedColumnName = "kit_id", nullable = false, insertable = false, updatable = false),
        @JoinColumn(name = "business_id", referencedColumnName = "business_id", nullable = false, insertable = false, updatable = false)},
    inverseJoinColumns = {
        @JoinColumn(name = "business_id", referencedColumnName = "business_id", nullable = false),
        @JoinColumn(name = "manufacturer_id", referencedColumnName = "manufacturer_id", nullable = false),
        @JoinColumn(name = "product_id", referencedColumnName = "product_id", nullable = false),
        @JoinColumn(name = "name", referencedColumnName = "name", nullable = false)
    })
    private Set<BusinessProduct> businessProducts = new HashSet<BusinessProduct>();
}

KitId.java

@Embeddable
public class KitId
{
    @Column (name = "kit_id")
    private String kitId;

    @Column (name = "business_id")
    private long businessId;
}

BusinessProduct.java

@Entity
@Table(name = "business_product")
public class BusinessProduct
{
    @EmbeddedId
    private BusinessProductId id;
}

BusinessProductId.java

@Embeddable
public class BusinessProductId
{
    @Column(name = "business_id")
    private long businessId;

    @Column(name = "manufacturer_id")
    private long  manufacturerId;

    @Column(name = "product_id")
    private String productId;

    @Column(name = "name")
    private String name;
}

使用此代码,我得到以下给定的错误。

[RMI TCP Connection(3)-127.0.0.1] 2017-03-17 14:17:54,767 ERROR com.common.DatabaseSession [] Repeated column in mapping for collection: com.hibernate.Kit.businessProducts column: business_id
org.hibernate.MappingException: Repeated column in mapping for collection: com.hibernate.Kit.businessProducts column: business_id
at org.hibernate.mapping.Collection.checkColumnDuplication(Collection.java:341) ~[hibernate3.jar:3.6.10.Final]
at org.hibernate.mapping.Collection.checkColumnDuplication(Collection.java:364) ~[hibernate3.jar:3.6.10.Final]

这种情况的正确注释是什么?任何见解将不胜感激。谢谢!

0 个答案:

没有答案