双向一对多,一个为拥有方

时间:2016-03-08 13:10:31

标签: java hibernate jpa one-to-many bidirectional

有没有办法让'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;

}

2 个答案:

答案 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是保存子节点所必需的,无需设置父节点。