【问题标题】:Hibernate column used as a part of a composite primary key and a part composite foreign key at the same timeHibernate 列同时用作复合主键的一部分和部分复合外键
【发布时间】:2011-07-27 09:02:15
【问题描述】:

我得到了这个不允许更改的表结构,我在寻找 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 的 column 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'

谁能提出一个可行的解决方案?

非常感谢。

【问题讨论】:

    标签: java hibernate hibernate-mapping


    【解决方案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 节)

    【讨论】:

    • 那也不行; Repeated column in mapping for entity: TableD column: d2 (should be mapped with insert="false" update="false") 并添加 insert="false" update="false" 也无法正常工作
    【解决方案2】:

    您应该发布所有带注释的类。您是在所有类中使用@EmbeddedId 还是也使用IdClass? 您应该查看“派生身份的映射”部分中的 JPA 2 规范。我认为您需要在关联上使用 @MapsId。或者也将 @Id 注释放在关联上,但这将取决于您映射其他类的方式。

    【讨论】:

    • 这根本没有提供解决方案
    猜你喜欢
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    相关资源
    最近更新 更多