原因:org.hibernate.MappingException:实体映射中的重复列:

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

我有 2 个 table 具有一对多关系,一个 table 具有复合主键。

Table1:Key_Numbers-列-ID_UNIK(主键)等列 Table2: Key_Number_xml – 列 - ID_UNIK_Key_Number( 主键以及外键映射到 Key_Numbers ID_UNIK table), Line_Number(另一个主键),数据, 所以,我们有复合主键,其中之一是外键

我有 3 Java classes –

我在 Jboss EAP 应用程序服务器中收到以下错误消息:

原因:org.hibernate.MappingException:实体映射中的重复列:keynumberXMLBean 列:ID_UNIK_Key_Number(应使用 insert="false" update="false")"}} }

我不确定我们是否应该在两个 classes(Key class 和 Main class)中映射 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;

如错误所述,“ID_UNIK_Key_Number”列在 keynumberXMLBean 实体中映射了两次,一次在 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)(post persist/flush/commit - 它何时会生成序列值)。