原因: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 –
- 密钥编号 - Key_Numbers table
的实体 Class
- 复合主键的 keynumberXMLBeanKey
- child class
的 keynumberXMLBean
我在 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 - 它何时会生成序列值)。
我有 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 –
- 密钥编号 - Key_Numbers table 的实体 Class
- 复合主键的 keynumberXMLBeanKey
- child class 的 keynumberXMLBean
我在 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 - 它何时会生成序列值)。