![](/img/trans.png)
[英]Caused by: org.hibernate.MappingException: Repeated column in mapping for entity
[英]Caused by: org.hibernate.MappingException: Repeated column in mapping for entity:
我有 2 個具有一對多關系的表,一個表具有復合主鍵。
表 1:Key_Numbers – 列 – ID_UNIK(主鍵)和其他列復合主鍵,其中之一是外鍵
我有 3 個 Java 類 –
我在 Jboss EAP 應用程序服務器中收到以下錯誤消息:
由以下原因引起:org.hibernate.MappingException:實體映射中的重復列:keynumberXMLBean 列:ID_UNIK_Key_Number(應使用 insert="false" update="false")"}} }
我不確定我們是否應該在兩個類(密鑰 class 和主類)中使用 map ID_UNIK_Key_Number。
@Entity
@Table(name = "Key_Numbers")
public class Keynumber implements Serializable {
private static final long serialVersionUID = 2816559889798956666L;
@Id
@GeneratedValue
@Column(name = "ID_UNIK")
private Integer id_unik;
@OneToMany(mappedBy = "keynumber")
private Set<keynumberXMLBean> keynumberXMLBeans = new HashSet<keynumberXMLBean>(0);
@Embeddable
public class keynumberXMLBeanKey implements java.io.Serializable {
static final long serialVersionUID = 3206093459760846163L;
@Column(name = "Line_Number")
public Integer linenumber;
@Column(name = "ID_UNIK_Key_Number")
public Integer idUnikKeyNumber;
@Entity
@Table(name = "Key_Number_xml")
public class keynumberXMLBean {
@EmbeddedId
private keynumberXMLBeanKey pk;
@Column(name = "DATA")
private String data;
@ManyToOne
@JoinColumn(name = "ID_UNIK_Key_Number")
private Keynumber keynumber;
正如錯誤所述,您在 keynumberXMLBean 實體中映射了兩次“ID_UNIK_Key_Number”列,一次在 keynumber ManyToOne 中,第二次在 keynumberXMLBeanKey 中可嵌入為基本 idUnikKeyNumber 屬性。 這會導致問題,因為您已將兩者都指定為控制該列,因此如果它們發生沖突,它就無法知道使用哪個來設置值。 解決方案,如錯誤所述,是將一個標記為只讀(insertable=false,updatable=false)
@Entity
@Table(name = "Key_Number_xml")
public class keynumberXMLBean {
@EmbeddedId
private keynumberXMLBeanKey pk;
@Column(name = "DATA")
private String data;
@ManyToOne
@JoinColumn(name = "ID_UNIK_Key_Number", insertable=false, updatable=false)
private Keynumber keynumber;
}
這樣做意味着 JPA 將幾乎忽略寫操作時的鍵號引用,而是使用 keynumberXMLBean.pk.idUnikKeyNumber 填充 FK 列 - 因此您的應用程序需要根據引用的 keynumber.id_unik 值設置它。 這當然可能是一個問題,如果你在同一個事務中創建兩者,為什么 JPA 有派生 ID,允許你將你的關系標記為 ID 的一部分而不將外鍵映射為基本列,或者兩者都與@MapsId注解。
假設您仍然需要一個封裝的 embeddedID 值:
@Entity
@Table(name = "Key_Number_xml")
public class keynumberXMLBean {
@EmbeddedId
private keynumberXMLBeanKey pk;
@Column(name = "DATA")
private String data;
@MapsId(value = "idUnikKeyNumber")
@ManyToOne
@JoinColumn(name = "ID_UNIK_Key_Number")
private Keynumber keynumber;
}
有了這個,JPA 將使用該關系在需要時從 Keynumber 中生成的序列中為您設置 keynumberXMLBean.pk.idUnikKeyNumber 值(以及 fk)(發布持久/刷新/提交 - 無論何時它都會生成序列價值)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.