不同嵌入式中的相同字段
Same fields in different Embedded
我有 3 个表 A、B、C:
@Embeddable
public class AModel {
@Column(name = "a_id", insertable = false, updatable = false)
private int id;
@Column(name = "a_name")
private String name;
}
@Embeddable
public class BModel {
@Column(name = "b_id", insertable = false, updatable = false)
private int id;
private int aId;
@Column(name = "b_name")
private String name;
}
@Embeddable
public class CModel {
@Column(name = "c_id", insertable = false, updatable = false)
private int id;
private int aId;
@Column(name = "c_name")
private String name;
}
我有不可变的实体
@Entity
@Immutable
public class AEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "a_id")
private int id;
@Embedded
private AModel aModel;
@Embedded
private BModel bModel;
@Embedded
private CModel cModel;
}
我使用 EntityManager.createNativeQuery 和以下查询创建的:
select * from A natural join B natural join C;
但是我遇到了一个异常,原因是:
org.hibernate.DuplicateMappingException: Table [aentity] contains physical column name [a_id] represented by different logical column names: [a_id], [aId]
更新:解决方案
给bModel和cModel添加如下注解可以解决这个问题:
@AttributeOverrides({
@AttributeOverride(name = "aId", column = @Column(name = "a_id", insertable = false, updatable = false))
})
您正在将@Id、@Column 与您的可嵌入class AModel 一起使用。如果您想将 AModel 作为复合键,则可以使用 @EmbeddedId。当您在 AEntity 中定义 @Column(name = a_id) 并且在可嵌入的 class AModel 中定义相同的东西时,问题就来了,因此得到重复的逻辑映射。
我有 3 个表 A、B、C:
@Embeddable
public class AModel {
@Column(name = "a_id", insertable = false, updatable = false)
private int id;
@Column(name = "a_name")
private String name;
}
@Embeddable
public class BModel {
@Column(name = "b_id", insertable = false, updatable = false)
private int id;
private int aId;
@Column(name = "b_name")
private String name;
}
@Embeddable
public class CModel {
@Column(name = "c_id", insertable = false, updatable = false)
private int id;
private int aId;
@Column(name = "c_name")
private String name;
}
我有不可变的实体
@Entity
@Immutable
public class AEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "a_id")
private int id;
@Embedded
private AModel aModel;
@Embedded
private BModel bModel;
@Embedded
private CModel cModel;
}
我使用 EntityManager.createNativeQuery 和以下查询创建的:
select * from A natural join B natural join C;
但是我遇到了一个异常,原因是:
org.hibernate.DuplicateMappingException: Table [aentity] contains physical column name [a_id] represented by different logical column names: [a_id], [aId]
更新:解决方案
给bModel和cModel添加如下注解可以解决这个问题:
@AttributeOverrides({
@AttributeOverride(name = "aId", column = @Column(name = "a_id", insertable = false, updatable = false))
})
您正在将@Id、@Column 与您的可嵌入class AModel 一起使用。如果您想将 AModel 作为复合键,则可以使用 @EmbeddedId。当您在 AEntity 中定义 @Column(name = a_id) 并且在可嵌入的 class AModel 中定义相同的东西时,问题就来了,因此得到重复的逻辑映射。