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

JPA mapping issue when mapping two entities with same `JoinColumn`

我遇到了一些奇怪的情况,例如,我有一个名为 Article 的实体,它与 Supplier 有关系,还有 供应商联系人 。例如:

Supplier 由 Supplier_Idlinked 到 Article,而 ContactpersonSupplier 由 Supplier_Id(到 SupplierId)和 Supplier_Contactperson_Idlinked 到 Article (到 Id)。

所以,现在我们将所有关系映射到 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")

在正常情况下你会link他们像这样:Article -> ContactpersonSupplier -> Supplier,然后就没有问题了。

但是,ContactpersonSupplier不是必需的,但是Supplier是必需的。这意味着如果我们离开联系人,我们将无法提供供应商。

出于同样的原因,我们不能使用 insertable = false, updatable = false,如果我们将这些值放在 supplier 上,如果没有提供联系人,我们将无法添加供应商。
我们也不能将它们添加到 supplierContactperson 上,因为 JPA/Hibernate 要求您将它放在 @JoinColumns 内的所有 @JoinColumn 上,如果我们这样做,我们就不能保存联系人。

我们的一个想法是简单地映射 ID,而不是使用相关实体,但我们想知道是否有其他可行的方法。那么问题来了,我们该如何解决这个映射问题呢?

不过要提一点,数据结构不能改变。

仅映射 ContactPersonSupplier 的 id 有一个问题:您可以将供应商 A 和供应商 B 的联系人放在一起,数据库不会抱怨。 由于需要供应商,我会尝试: 1. 在contact person字段的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;

这对我有用:

 @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;

然后在二传手 对于 setSupplierContactPerson(contactPerson)

    supplierContactPerson = contactPerson;
if (contactPerson!=null){
       supplier_id = contactPerson.getSupplierID();
       supplier_contact_Person_id = contactPerson.getSupplierContactPersonID();
}

对于 setSupplier(供应商):

supplier = supplier;
 if (supplier != null){
   supplier_id = supplier.getId();

}