java - 合并 JPA 实体返回旧值

标签 java jpa-2.0 eclipselink

我有 2 个 JPA 实体,它们之间存在双向关系。

@Entity
public class A {

     @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
     B b;

     // ...
}

@Entity
public class B {

     @OneToMany(mappedBy="b",cascade={CascadeType.PERSIST, CascadeType.MERGE})
     Set<A> as = new HashSet<A>();

     // ...
}

现在我更新了一个分离的 A 的一些字段值,它也与一些 Bs 有关系,反之亦然,并通过

将它合并回来
public String save(A a) {
    A returnedA = em.merge(a);
}

returnedA 现在在更新它们之前具有 A 的值。 我想

  FINEST: Merge clone with references A@a7caa3be
  FINEST: Register the existing object B@cacf2dfb
  FINEST: Register the existing object A@a7caa3be
  FINEST: Register the existing object A@3f2584b8

表示 B 中引用的 As(仍然具有旧值)负责覆盖新值?

有没有人知道如何防止这种情况发生?

非常感谢任何想法!

提前致谢。

最佳答案

Dirk,我遇到过类似的问题,解决方案(我可能没有正确利用 API)非常复杂。 Eclipselink 维护一个对象缓存,如果它们没有更新(合并/持久化),数据库通常会反射(reflect)更改,但级联对象不会更新(尤其是父对象)。

(我已将 A 声明为连接多个 B 的记录) 实体:

public class A
{
  @OneToMany(cascade = CascadeType.ALL)
  Collection b;
}

public class B
{
  @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH}) //I don't want to cascade a persist operation as that might make another A object)
  A a;
}

在上述情况下,解决方法是:

public void saveB(B b) //"Child relationship"
{
  A a = b.getA();//do null checks as needed and get a reference to the parent
  a.getBs().add(b); //I've had the collection be null
  //Persistence here
  entityInstance.merge(a); // or persist this will cascade and use b
}

public void saveA(A a)
{
  //Persistence
  entityInstance.merge(a) // or persist
}

您在这里所做的是将合并从顶部向下层叠到链中。维护起来很烦人,但确实能解决问题。或者,您可以通过检查它是否分离和刷新/替换来处理它,但我发现使用它不太令人满意并且令人讨厌。

如果有人对正确的设置有更好的回答,我将很乐意听到。现在,我已经为我的关系实体采用了这种方法,维护起来肯定很烦人。

祝你好运,我很乐意听到更好的解决方案。

关于java - 合并 JPA 实体返回旧值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7501968/

相关文章:

java - 如何在for循环中设置JLabel的属性?

java - hibernate p6spy问题

java - 对象无法使用JPA持久化到数据库中,因为它没有序列化

java - 在 JPA Hibernate 中映射队列集合

java - 将 Java 构造函数与 Hibernate 查询结合使用

java - 当有行时 JPQL 计数返回 0

java - 嵌套异常是java.lang.StackOverflowError

java - 如何在编写单元测试时验证对象属性

java - 与 eclipse 集成 Sonar 插件

jpa - 内部异常 : java. sql.SQLSyntaxErrorException: ORA-00972: 标识符太长