2

私はHibernate3.6Final、Guice-persist、JPA2を使用しています。

とても良いです、私はすべてを構成しました、そして私の豆は@Version private Long version;ゲッターとセッターで、を持っています。

すべてのフィールドにequalsとハッシュコードを実装しました。

私のdaosaveメソッドは:

@Transactional
public void save(Product p){ em.persist(p); }

しかし、私が次のようなことをした場合:

Product p = new Product("name"); //id=null, version=null
dao.save(p); //works, id!=null, version=0
Product p2 = new Produto(10, 0, "other name"); //id, version, name
dao.save(p2); //works, but the version isnt updated, so my version still 0

次に、名前を変更してもう一度保存しようとすると、「StaleObjectstateException行が...によって更新または削除されました」というメッセージが表示されます...

オブジェクトを保存するときにエンティティマネージャにバージョンを更新させるために何をしなければならないのか、そしてなぜpersistがこれを行わなかったのかを知りたいです。

前もって感謝します。

4

2 に答える 2

2

(コードが新しい製品ではなく新しい製品を示していることを無視します)p2の場合、オブジェクトのインスタンス化でIDとバージョンを設定し、それを永続化します。オブジェクトの状態を永続化した後、p2は最後の既知の永続化された状態から変更されません->バージョンを更新する必要はありません。

(p2.setName( "yet another name")のようなことをしてから、p2.getVersion()...を実行して効果を確認します。

p othoにはバージョンがなく、コードまたはPresistenceContextを介して「あなた」によって直接設定されていませんでした。pを永続化すると、永続化コンテキストで管理されるため、バージョン番号が取得されます。この場合は、バージョン0(新しく作成されたもの)が取得されます。

于 2012-04-26T21:52:22.883 に答える
1

私はこの問題を次のように解決します。

@Transactional
public void persist(B bean) {
    em.persist(bean);
}

@Transactional
public B update(B bean) {
    bean = em.merge(bean);
    em.flush();
    return bean;
}

次に、saveメソッドを呼び出すだけで、このメソッドは何をする必要があるかを認識します。

@Transactional
public B save(B bean) {
    if (bean == null || bean.getId() == null) {
        persist(bean);
    } else {
        bean = update(bean);
    }
    return bean;
}
于 2012-05-03T11:05:28.900 に答える