JPA / OpenJPA合并始终导致嵌入对象的SQL UPDATE

时间:2015-01-07 11:32:14

标签: openjpa embeddable

考虑以下pojos:

@Embeddable
public class Info {
  private String name;
  public String getName(){
    return name;
  }
  public void setName(String name){
    this.name=name;
  }
}

@Entity
public class Person {
  @Id
  private long pid;
  public Person(long pid){
    this.pid=pid;
  }

  @Embedded
  private Info info = new Info();
  public Info getInfo(){
    return info;
  }
}

以及访问它的一些代码

{

 Person p = new Person(1);
 p.getInfo().setName("Foo");

 EntityManager em = ...

 em.merge(p); // <-- SQL INSERT or UPDATE expected

}

执行以下SQL:

第一次运行merge()跟随(如预期的那样):

  • SELECT p.name FROM person p,其中p.pid = 1
  • INSERT INTO person(pid,name)VALUES(1,&#39; Foo&#39;)

第二次运行merge()会执行以下操作,这是意料之外的:

  • SELECT p.name FROM person p,其中p.pid = 1
  • UPDATE person SET name =&#39; Foo&#39;在哪里pid = 1

为什么UPDATE会在第二次运行中发生?即使&#34; Foo&#34;仍然等于&#34; Foo&#34;?!

如果我不使用Info Embeddable,请输入&#34; name&#34;属性为Person类,merge()的第二次运行就像预期的那样:有一个SELECT但没有执行UPDATE

1 个答案:

答案 0 :(得分:0)

对我来说,这似乎是一个OpenJPA错误或缺失的功能,如果我切换到EclipseLink实现,一切都按预期工作。

此外,在存在ID(但在分离实体上)的.merge(new Entity())期间,使用EclipseLink更新(也无效)具有不同值的所有字段,而在OpenJPA中,空字段不会同步到数据库。所以,EclipseLink再次按预期执行。