>想象一下,使用Hibernate和JPA有以下简化的代码:
@Entity
class C {
@Id @GeneratedValue public long id;
}
@MappedSuperclass
abstract class A {
@Id @GeneratedValue public long id;
@OneToMany(cascade = CascadeType.ALL)
public List<C> list1;
@OneToMany(cascade = CascadeType.ALL)
public List<C> list2;
}
@Entity
class B extends A { }
使用 PostgreSQL 数据库,这会导致一个b_c
列的表
b_id | list1_id | list2_id
现在,尝试保留任何B
会导致以下异常:
org.postgresql.util.PSQLException: FEHLER: NULL-Wert in Spalte „list2_id“ verletzt Not-Null-Constraint
Detail: Fehlgeschlagene Zeile enthält (779, 827, null).
大致翻译为
NULL-Value in column "list2_id" violates Non-Null-Constraint. Contents: (770, 827, null)
为什么会发生这种情况,我该如何避免?
将列表合并为一个不是一种选择。改用"集"不会改变任何内容。
这是由于单向@OneToMany
关联而发生的。您需要首先确定关联是单向的还是双向的。
如果关联是单向的,则需要使用 @JoinColumn
来解决额外的联接表问题。如果关联是双向的,则您将依赖@ManyToOne
端来传播所有实体状态更改,并在@OneToMany
端使用mappedBy
。您可以在此处找到有关不同关联方式@OneToMany
很好的解释。