考虑以下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()跟随(如预期的那样):
第二次运行merge()会执行以下操作,这是意料之外的:
为什么UPDATE会在第二次运行中发生?即使&#34; Foo&#34;仍然等于&#34; Foo&#34;?!
如果我不使用Info Embeddable,请输入&#34; name&#34;属性为Person类,merge()的第二次运行就像预期的那样:有一个SELECT但没有执行UPDATE
答案 0 :(得分:0)
对我来说,这似乎是一个OpenJPA错误或缺失的功能,如果我切换到EclipseLink实现,一切都按预期工作。
此外,在存在ID(但在分离实体上)的.merge(new Entity())期间,使用EclipseLink更新(也无效)具有不同值的所有字段,而在OpenJPA中,空字段不会同步到数据库。所以,EclipseLink再次按预期执行。