0

次の 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 は実行されません。

4

1 に答える 1