JPA / OpenJPA合并总是导致嵌入对象上的SQL UPDATE



请考虑以下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() 执行以下操作(如预期):

  • 从人员 p 中选择 p.name,其中 p.pid=1
  • 插入到人员(PID,姓名)值(1,'Foo')

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

  • 从人员 p 中选择 p.name,其中 p.pid=1
  • 更新人员设置名称='Foo' 其中 pid=1

为什么更新发生在第二次运行中? 即使"Foo"仍然等于"Foo"?!

如果我不使用信息嵌入,而是将"name"属性放入 Person 类中,则 merge() 的第二次运行按预期工作:有一个选择但没有执行更新

对我来说,

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

此外,在现有ID上的.merge( new Entity())期间(但在分离的实体上),所有具有不同值的字段都会使用EclipseLink进行更新(也无效),而在OpenJPA中,空字段不会同步到数据库。因此,EclipseLink 在这里的表现符合预期。

相关内容

  • 没有找到相关文章

最新更新