基于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_id
和c_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和注释,只要它在类A
或D
中。