MappedSuperclass中的Hibernate OneToMany因Null Constraint Violation而失败

时间:2018-01-10 15:21:46

标签: java hibernate jpa orm

基于Why does hibernate save two @OneToMany lists in one table?

想象一下使用Hibernate和JPA遵循简化代码:

@Entity
class D {
    @Id @GeneratedValue public long id;
}

@MappedSuperclass
abstract class A {
    @Id @GeneratedValue public long id;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "listcontents")
    public List<D> list1;
}

@Entity class B extends A { }
@Entity class C extends A { }

这会产生一个如下所示的连接表:

b_id | d_id | c_id

其中d_id引用列表中的项目,其他ID引用相应实现类的实例。问题:b_idc_id都是NON_NULL,因此只要hibernate尝试加载任何扩展A的类,就会抛出异常:

org.postgresql.util.PSQLException: FEHLER: NULL-Wert in Spalte „b_id“ verletzt Not-Null-Constraint
Detail: Fehlgeschlagene Zeile enthält (null, 1114, 779).

大致转化为

Error: NULL-value in column "b_id" violates Non-Null-Constraint. Contents: (null, 1114, 779)

因为类B的对象显然没有对C的引用。

如何使其工作? (扩展A的每个类都应该具有对List<D>的持久单向引用,而无需编写额外的单个字符扩展类中的代码)

我可以根据自己的喜好自由更改ID和注释,只要它在类AD中。

0 个答案:

没有答案