2

したがって、オブジェクトを作成および更新するための次のコードを持つfollowエンティティがあります。メソッドを呼び出した後の結果のデータは、フィールドがローカルコンピューターで実行されているデータストアValueのの値を持っていることです。1なんで?オブジェクトはJPAで管理されており(またはこの記事で説明されているように添付されて)、更新されることになっていますか?em2.close()

実在物:

@Entity 
public class MyObj {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long Id;
    public int Value = 0;
}

コード:

public void createAndUpdate() {
    Long id = null;
    // Line below calls Persistence.createEntityManagerFactory("transactions-optional").createEntityManager()
    EntityManager em1 = Database.getEntityManager(); 
    MyObj obj = new MyObj();
    obj.Value = 1;      
    em1.persist(obj);
    em1.close();
    id = obj.Id;

    EntityManager em2 = Database.getEntityManager();
    obj = (MyObj) em2.find(MyObj.class, id);
    obj.Value = 2;
    // NOTE1
    em2.close();        
}

マークされた行NOTE1に挿入を試み em2.persist(obj)ました(私が読んだものからでも、添付されたオブジェクトを返すem2.merge(obj)ので、それは必要ではないはずです)。それらのどれも助けませんでした。find()

JPAv1を使用しています。

4

1 に答える 1

2

JPA仕様にあるように、エンティティオブジェクトのフィールドを直接更新することはできませんが、投稿されたコードではそれだけを行います(したがって、永続性プロバイダーは何かが変更されたことを知る方法がないため、それらの変更をデータストアにフラッシュできません)。

DataNucleus JPAでは、フィールドを「PersistenceAware」に拡張する場合、実際にはフィールドを直接更新できます。

解決策:セッターを使用してフィールドを更新する

于 2013-02-27T15:42:47.833 に答える