我有一个类 A{Set b .....},它将 B 类的引用保存为 Set。这是一对多的关系。 这两个类在 oracle 中都有定序器。我将级联添加到休眠注释中的所有内容。当我保存 A 类时,它给我错误,无法插入 null B.a_id 。 A-id 在我的数据库中不可为空。我怎样才能维持这种关系。
这是从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;
我遇到了同样的问题,并通过使用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 只在一处指定,没有重复的代码。
对于遇到类似问题的任何人,除了标记为正确的答案之外,您还必须在每个子实体中设置父实体。否则你会得到
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;