想象一下使用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)
为什么会发生这种情况,我该如何避免呢?
将列表合并为一个不是一种选择。相反,使用集合不会改变任何内容。
答案 0 :(得分:0)
由于单向@OneToMany
关联,这种情况正在发生。您需要首先确定您的关联是单向还是双向。
如果您的关联是单向的,那么您需要使用@JoinColumn
来修复额外的连接表问题。如果您的关联是双向的,那么您将依赖@ManyToOne
方传播所有实体状态更改,并mappedBy
侧使用@OneToMany
。您可以找到有关@OneToMany
关联here的不同方式的详细说明。