次の pojo を検討してください。
@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 where p.pid=1
- INSERT INTO person (pid,name) VALUES (1,'Foo')
2 回目の実行の merge() は次のようになりますが、これは予想外です。
- SELECT p.name FROM person p where p.pid=1
- UPDATE 人 SET name='Foo' WHERE pid=1
UPDATE が 2 回目の実行で発生するのはなぜですか? 「Foo」は「Foo」と等しいのに?!
Info Embeddable を使用せず、代わりに「name」プロパティを Person クラスに配置すると、merge() の 2 回目の実行は期待どおりに機能します。SELECT はありますが、UPDATE は実行されません。