有没有办法让'one'成为一对多关系的所有者?每个样本在mappedBy
中都有@OneToMany
。甚至对this similar question的回答也是如此。
我希望一方成为拥有方,因为当我添加一个/多个孩子时,我也会更改一个/父的一些信息,我只想更新一个父代,以简化代码并确保它所有这些都在同一个ACID交易中进行。
但我无法让它发挥作用。 Hibernate一直在抱怨
实体映射中的重复列
我的实体:
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@OneToMany(fetch = EAGER, cascade = {ALL}, orphanRemoval = true)
@JoinColumn(name = "parent_id", referencedColumnName = "id", nullable = false)
private final Set<Child> children = new HashSet<>();
}
public class Child {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ManyToOne
private Parent parent;
}
答案 0 :(得分:1)
解决实体错误映射中的重复列。
您可以从nullable=false
注释中移除@JoinColumn
,如下所示:
而不是
@JoinColumn(name = "parent_id", referencedColumnName = "id", nullable = false)
尝试
@JoinColumn(name = "parent_id", referencedColumnName = "id", insertable = false, updatable = false)
但是如果你想保留nullable=false
,那么
从private Parent parent;
类
Child
声明
或
使用@Transient
注释或private transient Parent parent;
答案 1 :(得分:0)
你有什么
@JoinColumn(name = "parent_id", referencedColumnName = "id")
与
没有什么不同@OneToMany(mappedBy="parent", fetch = FetchType.EAGER, cascade = {CascadeType.ALL}, orphanRemoval = true)
从表面上看。你做这件事的动机是什么?
编辑:好的,好的。你坚持双向关系的方式有所不同。如果使用mappedBy
,则必须设置父项,如果使用@JoinColumn
则不必设置父项,但仅当您删除,
insertable = false时,才可以更新= false`,所以我不确定为什么要讨论必须包含这些内容。另外,我不确定为什么你有hibernate重复列错误,我没有得到类似的东西。应该注意的是,CascadeType.ALL是保存子节点所必需的,无需设置父节点。