是否可以使用具有复合键的连接表在两个表之间定义多对多关系,在两个表之间具有公共属性?
假设我们有一个如下所示的表结构,并尝试使用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]
这种情况的正确注释是什么?任何见解将不胜感激。谢谢!