2012-04-26 7 views
2

私はHibernate 3.6 Final、Guice-persist、およびJPA2を使用しています。JPA2 + Hibernate + Guice-persist:バージョンの振る舞い

すべての設定が完了しており、私のbeanにはゲッターとセッターがある@Version private Long version;があります。

すべてのフィールドでequalsとhashcodeを実装しました。

保存方法私のDAOは以下のとおりです。私は名前を変更して再度保存しようとするならば、私は「StaleObjectstateExceptionを得、その後

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 

:私のような何かを行う場合は、

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

しかし、行が更新または削除されました...」...

オブジェクトを保存するときにエンティティマネージャにバージョンを更新させるにはどうすればよいか知りたいです。

ありがとうございます。

答えて

1

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

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

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

次に、保存方法と、この方法LLそれが何をすべきか知っている:

@Transactional 
public B save(B bean) { 
    if (bean == null || bean.getId() == null) { 
     persist(bean); 
    } else { 
     bean = update(bean); 
    } 
    return bean; 
} 
2

(新しいプロダクトではなく、新しいプロダクトは無視されます) p2では、オブジェクトのインストール時にIDとバージョンを設定してから永続化します。 オブジェクトの状態を保持した後、p2は最後の既知の永続状態から変更されません。 - >バージョンを更新する必要はありません。

( p2.setNameような何かを行う( "まだ別の名前")、そしてp2.getVersionは()...効果を確認するために行う。

のpオトはどちらも直接、任意のバージョンを持っていませんでしたあなたがpを永続化すると、永続コンテキストで管理され、バージョン番号を取得します。この場合、バージョン0(新しく作成されたバージョン)が得られます。

+2

うーん...私は理解して...問題は、私はGWTを使用するということですので、私はDTOのとなどへの変換を行う必要があります..ので、私は私が示す例のような何かをしなければならない...これを解決するための良い方法のための任意のアイデアを得た?実際には、私は "保存"メソッドを作成し、Beanを返し、私は、マージを呼び出すときに、私は永続化またはマージを呼び出すかどうかを決定し、私もフラッシュし、その後、Beanを返します。これは動作しますが、醜いです... BTW、回答ありがとう:) – caarlos0

+0

申し訳ありません、GWT/GINの経験はありません。一般的に分離されたエンティティは、まともなDTOを作ることができますが、現在のユースケースに対して特別な特性が必要かどうかはわかりません。 – esej