我正在使用Hibernate 4.3,并试图在无法更改的旧数据库实体之间建立关系模型。
我试图映射表B和表A之间的多对一关系。表A具有由3列组成的复合主键。这些列之一是其自身的唯一键(并具有唯一的约束)。表B还具有一个复合主键。表B的组合PK的一个字段是使用该唯一值的表A的FK。不管我如何尝试映射这种关系,我通常都会收到Hibernate的错误消息。
为简洁起见,以下是与该问题无关的字段:
@Embeddable
class APk {
private int site;
private int client;
private int id;
@Column(name = "site", nullable = false)
public int getSite() { return this.site; }
@Column(name = "client", nullable = false)
public int getClient() { return this.client; }
@Id
@Column(name = "id", nullable = false)
public int getId() { return this.id; }
}
@Entity
@Table(name = "A", uniqueConstraints = { @UniqueConstraint(columnNames = "id") })
class A {
private APk id;
private String otherStuff;
@EmbeddedId
public APk getAPk() { return this.id; }
}
@Embeddable
class BPk {
private String value;
private int aId;
@Column(name = "VALUE", nullable = false)
public String getValue() { return this.value; }
@Column(name = "A_ID", nullable = false)
public int getAId() { return this.aId; }
}
@Entity
@Table(name = "B")
class B {
private BPk id;
private String moreFields;
private A entityA;
@EmbeddedId
public BPk getId() { return this.id; }
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "a_id", referencedColumnName = "id", insertable = false, updatable = false)
public A getEntityA() { return this.entityA; }
}
我尝试将@JoinColumn
与该单个字段一起使用,但收到以下两条错误消息之一:
referencedColumnNames(ID) of B referencing A not mapped to a single property
referencedColumnName
属性并添加@MapsId("id")
批注,则会收到错误消息:
org.hibernate.AnnotationException: A Foreign key refering A from B has the wrong number of column. should be 3
一些注意事项:
@MapsId
注释中删除referencedColumnName
属性时,我认为我没有正确使用@JoinColumn
注释在Hibernate(4)中有没有办法解决这个问题?这种非标准关系是否需要@JoinFormula
?
编辑:我尝试了其他一些尝试,但没有成功:
@Embeddable/@EmbeddedId
注释替换@IdClass
注释@JoinColumnsOrFormulas
注释和两个“缺失”字段的公式,这两个实体在实体B中不可用,但属于实体A的PK。