映射具有相同`JoinColumn`的两个实体时的JPA映射问题

时间:2015-01-20 12:48:29

标签: java hibernate jpa

我有一些奇怪的情况,例如我有一个名为 Article 的实体,它与供应商有关系,但也与供应商联系人即可。例如:

ERD

供应商与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,而不是使用相关实体,但我们想知道是否有可能有效的替代方法。所以问题是,我们应该如何解决这个映射问题?

但有一点需要注意,数据结构无法更改。

2 个答案:

答案 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;