我有一些奇怪的情况,例如我有一个名为 Article 的实体,它与供应商有关系,但也与供应商联系人即可。例如:
供应商与Supplier_Id链接,而ContactpersonSupplier通过Supplier_Id(至SupplierId)和Supplier_Contactperson_Id(至Id)链接至Article。
所以,现在我们在Article
上映射了所有关系:
@JoinColumn(name = "Supplier_Id")
private Supplier supplier;
@JoinColumns({
@JoinColumn(name = "Supplier_Id"),
@JoinColumn(name = "Supplier_Contactperson_Id")
private SupplierContactperson supplierContactperson;
这不起作用,因为我们要映射 Supplier_Id 两次,一次用于supplier
,一次用于supplierContactperson
。如果这样做,则会出现以下异常:
org.hibernate.MappingException: Repeated column in mapping for entity: Article column: Supplier_Id (should be mapped with insert="false" update="false")
在正常情况下,您可以将它们链接起来:Article
- > ContactpersonSupplier
- > Supplier
,然后就没有问题了。
但是,ContactpersonSupplier
不是必需的,但需要Supplier
。这意味着如果我们离开联系人,我们就无法提供供应商。
出于同样的原因,我们无法使用insertable = false, updatable = false
,如果我们将这些值放在supplier
上,如果未提供联系人,我们就无法添加供应商。
我们也无法在supplierContactperson
添加它们,因为JPA / Hibernate要求您将其放在@JoinColumn
内的所有@JoinColumns
上,如果我们这样做,我们就无法保存contactperson。
我们的一个想法是简单地映射ID,而不是使用相关实体,但我们想知道是否有可能有效的替代方法。所以问题是,我们应该如何解决这个映射问题?
但有一点需要注意,数据结构无法更改。
答案 0 :(得分:2)
这对我有用:
@JoinColumn(name = "Supplier_Id",insertable=false,updatable=false)
private Supplier supplier;
@JoinColumns({
@JoinColumn(name = "Supplier_Id",insertable=false,updatable=false),
@JoinColumn(name = "Supplier_Contactperson_Id",insertable=false,updatable=false)
private SupplierContactperson supplierContactperson;
@Column(name="Supplier_Id")
private String supplier_id;
@Column (name = "Supplier_Contactperson_Id")
private String supplier_contact_Person_id;
然后在二传手中 for setSupplierContactPerson(contactPerson)
supplierContactPerson = contactPerson;
if (contactPerson!=null){
supplier_id = contactPerson.getSupplierID();
supplier_contact_Person_id = contactPerson.getSupplierContactPersonID();
}
for setSupplier(supplier):
supplier = supplier;
if (supplier != null){
supplier_id = supplier.getId();
}
答案 1 :(得分:0)
仅映射ContactPersonSupplier的ID有一个问题:您可以从供应商A和供应商B中放置联系人,数据库不会抱怨。 由于需要供应商,我试试: 1.在联系人字段的JoinColumn(" supplier_id")中输入insert = false,update = false,以避免来自JPA的投诉。 2.修改(如果仍然没有)setSupplierContactPerson()
if (contactPerson != null){
setSupplier(contactPerson.getSupplier());
} else {
setSupplier(null);
}
另一种选择是使用
修改getSupplier()if (contactPerson != null){
return contactPerson.getSupplier();
}
return supplier;