我得到了这个表结构,我们不允许更改,我在查找Hibernate映射解决方案时遇到了问题。
表A
a1 (pk)
a2
表B
b1 (pk, fk on 'A.a1')
b2 (pk)
b3
表C
c1 (pk, fk on 'B.b1')
c2 (pk, fk on 'B.b2')
c3 (pk)
c4
表D
d1 (pk)
d2 (pk, fk on 'A.a1')
d3 (fk on 'C.c2')
d4 (fk on 'C.c3')
d5
现在我遇到的问题是表D的列d2 的b级,它是复合键的一部分,也是表C中外键的一部分
在Hibernate中我做了这个
@Embeddable
public class TableDId {
private Long d1;
private TableA d2;
@Column(name="d1")
public Long getD1() {
return this.d1;
}
@ManyToOne
@JoinColumn(name="d2")
public Long getD2() {
return this.d2;
}
// Setters
}
@Entity
public class TableD {
private TableDId id;
private TableC tableC;
@EmbeddedId @GeneratedValue(strategy = GenerationType.AUTO)
public TableDId getId() {
return this.id;
}
@ManyToOne
@JoinColumns({
@JoinColumn(name="id.d2", referencedColumnName="c1"),
@JoinColumn(name="d3", referencedColumnName="c2"),
@JoinColumn(name="d4", referencedColumnName="c3")
})
public TableC getTableC() {
return tableC;
}
// Setters
}
您可以猜测这不起作用,我在保存新的TableD
时遇到了Hibernate错误java.sql.BatchUpdateException: Unknown column 'id.d2' in 'field list'
有人可以提出有效的解决方案吗?
Thanx很多。
答案 0 :(得分:1)
@JoinColumn(name="id.d2", referencedColumnName="c1")
尝试删除ID。来自地图
@JoinColumn(name="d2", referencedColumnName="c1")
示例http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html(第2.2.6节)
答案 1 :(得分:-1)
您应该发布所有带注释的类。您是否在所有类 @EmbeddedId 中使用,还是使用 IdClass ? 您应该查看“派生身份映射”部分中的JPA 2规范。我估计你需要在关联上使用 @MapsId 。或者也将 @Id 注释放在关联上,但这取决于你如何映射其他类。