【问题标题】:Bidirectional one-to-many with one as owning side双向一对多,一个作为拥有方
【发布时间】:2016-03-08 13:10:30
【问题描述】:

有没有办法让“一”成为一对多关系的所有者?每个样本在@OneToMany 中都有mappedBy。甚至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;

}

【问题讨论】:

  • 你能成功吗?我遇到了完全相同的问题。

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


【解决方案1】:

解决实体映射中的重复列错误。

您可以从@JoinColumn 注释中删除nullable=false,如下所示:

代替

@JoinColumn(name = "parent_id", referencedColumnName = "id", nullable = false)

试试

@JoinColumn(name = "parent_id", referencedColumnName = "id", insertable = false, updatable = false)

但是如果你想保留nullable=false,那么

Child 类中删除private Parent parent; 声明

使用@Transient 注释或private transient Parent parent; 使其瞬态

【讨论】:

  • 你说对了一部分。我不得不用insertable = false, updatable = false替换nullable=false
  • @user384729 这是一个很好的观点。通过包含insertable = false, updatable = false,它不会触发额外的更新查询。
【解决方案2】:

你有什么

@JoinColumn(name = "parent_id", referencedColumnName = "id")

没有区别
@OneToMany(mappedBy="parent", fetch = FetchType.EAGER, cascade = {CascadeType.ALL}, orphanRemoval = true)

从表面上看。你这样做的动机是什么?

编辑:是的,好的。坚持双向关系的方式有所不同。如果使用mappedBy,则必须设置父级,如果使用@JoinColumn,则不必设置父级,但前提是删除,insertable = false,updatable = false`,所以我'不知道为什么会有关于必须包括这些的讨论。另外,我不确定你为什么会出现休眠重复列错误,我没有得到类似的东西。需要注意的是CascadeType.ALL是需要子级保存的,不用设置父级。

【讨论】:

  • 这很令人不安,希望是误会;否则我大错特错。我认为我所拥有的(您的第一个代码 sn-p)使我的 Parent 成为关系的拥有方。因此,我不需要手动持久化一个新的Child。我可以将它添加到父级并更新父级。对于您的第二个 sn-p,Child 将成为拥有方。我需要做child.setParent(parent) 并手动保存它,childDao.save(child)`。
猜你喜欢
  • 2013-09-15
  • 1970-01-01
  • 2012-09-25
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多