【问题标题】:JPA cascade Set contentJPA级联设置内容
【发布时间】:2012-01-10 17:44:16
【问题描述】:

你知道这是为什么吗:

class Owner {
  @OneToMany(mappedBy = "owner",
    cascade = CascadeType.ALL)
  public Set<Storage> storages
  ...

class Storage {
  @ManyToOne
  public Owner owner
  ...

没有按预期工作:

Storage s = new Storage("S1")
Owner o = new Owner("O1")
o.storages.add(s)
...
em.persistAndFlush(o)
...
s = Storage.get...
assert(s.owner != null, "Storage does not have an Owner")
o = Order.get...
assert(!o.storages.isEmpty, "Owner does not have any Storage")

测试失败:

[info] - Storage *** FAILED ***
[info]   Storage does not have an Owner

我该如何解决?

【问题讨论】:

    标签: jpa associations one-to-many cascade many-to-one


    【解决方案1】:

    此问题每 2 天被问一次。 JPA 使用双向关联的拥有方来了解关联是否存在。拥有方是存在 no mappedBy 属性的一方。因此,要告诉 JPA 所有者和存储之间存在关联,您必须设置存储的所有者:

    s.setOwner(o);
    

    【讨论】:

    • CascadeType.ALL 在哪里重要吗?因为现在,我得到“所有者没有任何存储空间”...
    • 保持对象图的一致性是您的责任。您必须初始化关联的双方。如果你只是设置了拥有端,关联会被持久化,但是 Hibernate 不会为你初始化另一端。如果您在 new 事务中重新加载对象,JPA 将为您填充双方。在当前事务期间,它将从其缓存中返回对象,就像您初始化它们一样。
    猜你喜欢
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 2014-02-26
    • 1970-01-01
    • 2023-03-03
    • 2016-12-13
    相关资源
    最近更新 更多