我有 2 個具有一對多關系的表,一個表具有復合主鍵。
表 1:Key_Numbers – Columns - ID_UNIK( Primary Key) 和其他列 Table2: Key_Number_xml – Columns - ID_UNIK_Key_Number( Primary key as well as Foreign key mapped with ID_UNIK from Key_Numbers table), Line_Number (Another primary Key), Data, 所以,我們有復合主鍵,其中一個是外鍵
我有 3 個 Java 類——
- Keynumber - Key_Numbers 表的物體類
- 復合主鍵的 keynumberXMLBeanKey
- 子類的 keynumberXMLBean
我在 Jboss EAP 應用程式服務器中收到以下錯誤訊息:
原因:org.hibernate.MappingException:物體映射中的重復列:keynumberXMLBean 列:ID_UNIK_Key_Number(應使用 insert="false" update="false")"}} }
我不確定我們是否應該在兩個類(Key 類和 Main 類)中映射 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;
uj5u.com熱心網友回復:
正如錯誤所述,您在 keynumberXMLBean 物體中映射了兩次“ID_UNIK_Key_Number”列,一次在 keynumber ManyToOne 內,第二次在 keynumberXMLBeanKey 內作為基本 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", insertable=false, updatable=false)
private Keynumber keynumber;
}
這樣做意味著 JPA 將幾乎忽略寫操作中的 keynumber 參考,而是使用 keynumberXMLBean.pk.idUnikKeyNumber 填充 FK 列 - 因此您的應用程式需要從參考的 keynumber.id_unik 值中設定它。如果您在同一個事務中創建兩者以及為什么 JPA 派生 ID,這當然可能是一個問題,允許您將您的關系標記為 ID 的一部分而不將外鍵映射為基本列,或者兩者都使用@MapsId注解。
假設您仍然需要一個封裝的嵌入 ID,其值為:
@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)(發布持久/重繪 /提交 - 何時生成序列價值)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/462563.html
上一篇:用于查詢最新記錄的JPA規范謂詞
