为什么休眠将两个@OneToMany列表保存在一个表中



>想象一下,使用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很好的解释。

最新更新