2012-02-14 10 views
0

私はSpring 3 + Hibernateを使用していますが、@ManyToManyの関係で互いに関連する2つのエンティティ(User、Address)があります。すべてのエンティティはテーブル( 'user'と 'address')にマッピングされ、関係はuser_idとaddress_idをマッピングするリンクテーブル 'user_address'によって定義されます。Spring + Hibernate:多対多関係のデータの保存とフェッチ

私は、新しいアドレスが追加された「ユーザーズ節約「method1に」持っている:

@Transactional 
public Address method2 (Long userId, String streetName) { 
    String hql = "select distinct a from Address a " + 
      "join a.users u " + 
      "where u.id=:id and a.name=:name"; 
      Query query = session.createQuery(hql); 
      query.setParameterList("id", userId); 
      query.setParameterList("name", streetName); 
      Address address = query.uniqueResult(); 
      return address; 
} 
:私は、特定のユーザーの街路によるアドレスを取得する必要があり、別法2で

@Transactional 
public void method1 (...) { 
    /* do something*/ 
    user.getAddresses().add(address); 
    session.save(user); 
} 

この問題は、method1経由で新しいアドレスが追加されたときに、method2が実行されたときに(アドレスが返されないので)、method2がデータベースにヒットしたときキャッシュ)。 私が見つけた唯一の解決策は、method1の後に "flush"を追加することですが、本当に好きではありません。あなたはより良い方法を知っていますか?

+0

ユーザ/アドレス注釈でカスケードがどのように宣言されていますか? –

+0

私はcascade = "all"を使用しています – Randomize

答えて

0

いくつかのメソッドでsession.flush()を手動で呼び出すことは、少なくとも私にとっては悪い考えではありません。

選択肢があります:

  • セットにHibernate FlushMode AUTOにか、常にREQUIRES_NEWする
  • 設定伝播レベル( 常に有用であることが高価であり、クエリ内の古い結果を防ぐ必要があり、最初のAUTOを試してみてください)メソッド1のトランザクション注釈では、メソッド1を常にコミットし、現在のトランザクションを中断し、新規のトランザクションを作成してユーザーを追加します。