为什么hibernate在一个表中保存两个@OneToMany列表?

时间:2018-01-05 14:52:48

标签: java postgresql hibernate jpa

想象一下使用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)

为什么会发生这种情况,我该如何避免呢?
将列表合并为一个不是一种选择。相反,使用集合不会改变任何内容。

1 个答案:

答案 0 :(得分:0)

由于单向@OneToMany关联,这种情况正在发生。您需要首先确定您的关联是单向还是双向。

如果您的关联是单向的,那么您需要使用@JoinColumn来修复额外的连接表问题。如果您的关联是双向的,那么您将依赖@ManyToOne方传播所有实体状态更改,并mappedBy侧使用@OneToMany。您可以找到有关@OneToMany关联here的不同方式的详细说明。