映射具有相同“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();
}
我遇到了一些奇怪的情况,例如,我有一个名为 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();
}