簡體   English   中英

引起:org.hibernate.MappingException:實體映射中的重復列:

[英]Caused by: org.hibernate.MappingException: Repeated column in mapping for entity:

我有 2 個具有一對多關系的表,一個表具有復合主鍵。

表 1:Key_Numbers – 列 – ID_UNIK(主鍵)和其他列復合主鍵,其中之一是外鍵

我有 3 個 Java 類 –

  • Keynumber - Key_Numbers 表的實體 Class
  • 復合主鍵的 keynumberXMLBeanKey
  • 孩子的 keynumberXMLBean class

我在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM