无法在一对多关系休眠注释中插入 null

问题描述 投票:0回答:3

我有一个类 A{Set b .....},它将 B 类的引用保存为 Set。这是一对多的关系。 这两个类在 oracle 中都有定序器。我将级联添加到休眠注释中的所有内容。当我保存 A 类时,它给我错误,无法插入 null B.a_id 。 A-id 在我的数据库中不可为空。我怎样才能维持这种关系。

java hibernate orm annotations
3个回答
22
投票

这是从A->B的单向关系。表 B 中的 a_id 列不可为空。当 hibernate 尝试保存类 B 时,它无法找到 a_id 的值。

那么,您是否尝试过让

JoinColumn
不再是
nullable

@OneToMany 
@Cascade({CascadeType.ALL}) 
@JoinColumn(name="A_ID", nullable=false)
private Set<B> b;

另请参阅


2
投票

我遇到了同样的问题,并通过使用A类中@OneToMany注释的mappedBy属性解决了它:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "m_a")
private Set<B> b;

这里,m_a是B类中引用A类的字段:

@JoinColumn(name = "aId", nullable = false)
@ManyToOne
private A m_a;

这样,@JoinColumn 只在一处指定,没有重复的代码。


0
投票

对于遇到类似问题的任何人,除了标记为正确的答案之外,您还必须在每个子实体中设置父实体。否则你会得到

Cannot insert the value NULL into column 'X'
。所以,使用上面的例子。

for (B b : listOfB) b.setA(A); // Here you must save the reference to the parent.

此外,如果您愿意,可以通过添加以下注释在实体上拥有子级的外部列。

@Column(insertable = false, updatable = false)
private Long aID;
© www.soinside.com 2019 - 2024. All rights reserved.