Hibernate列同时用作复合主键和部分复合外键的一部分

时间:2011-07-27 09:02:15

标签: java hibernate hibernate-mapping

我得到了这个表结构,我们不允许更改,我在查找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很多。

2 个答案:

答案 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 注释放在关联上,但这取决于你如何映射其他类。