2

有名なLazyInitializationExceptionを取得しました。

セッションに保存されているオブジェクトUserがあります。このオブジェクトには、レイジー初期化された他のオブジェクトMarketが含まれています。セッションでユーザーをロードするとき、Marketは重すぎて毎回必要ないため、ロードしません。

マーケットをロードしたいとき、私は別のトランザクションにあり、データベースからユーザーをリロードしたくありません。Marketオブジェクトを取得するにはどうすればよいですか?User.marketにHibernateプロキシが含まれているため、マーケットのIDが含まれていること、およびリフレクションを使用してHibernateをハックしたくないことを知っています。

ユーザーにロードせずにマーケットをロードできれば、それはさらに良いでしょう。ユーザーがセッションに参加しているので、セッションに多くのものを入れたくありません。

JPA互換のソリューションはさらに優れています。

乾杯

4

5 に答える 5

2

イーガーモードのフェッチが受け入れられず、トランザクションがマーケット検索まで維持できない場合は、特定のdaoメソッドを実装して、ユーザーからマーケットを具体的に取得できます。

public List<Market> retrieveMarketFromUser (final User user) {
  Query query = session.createQuery("SELECT m FROM User AS u INNER JOIN u.market as m WHERE u.userid = :uid");
  query.setParameter("uid", user.getId());
  List<Market> list = query.list();
  return list;
}

またはショートバージョン

  Query query = session.createQuery("SELECT u.market FROM User AS u WHERE u.userid = :uid");

これはおそらくあなたが期待していたJPAソリューションではなく、単なる回避策です。

于 2013-02-06T10:43:21.123 に答える
1

リレーションが双方向の場合、。のような句を含むクエリを使用して、マーケットを個別にロードできますwhere market.user.id = ?

于 2013-02-06T10:36:08.220 に答える
1

明らかな解決策が良くないのはなぜですか?提案された1つのring0のように、またはオブジェクトにすでにIDがある場合は、単にfindByIdorメソッドを使用します。findUser

//if using a session factory
session.findById(Market.class, marketId); 

//if using the EntityManager
em.find(Market.class, marketId);

構成方法によってはcurrent_session_context_class(私はそれを持っていhibernate.cfg.xmlます)、新しいトランザクションごとに新しいセッションがある場合があります。その場合は、そこにたくさんのものを入れることを心配する必要はありません。コンテキストセッションの詳細については、こちらをご覧ください。

于 2013-02-06T10:57:34.137 に答える
1

あなたがしなければならないことは、フィールドの代わりにアクセサに注釈を付けることです。これにより、最初にユーザーをロードするときにマーケットオブジェクトのロードを回避できますが、遅延ロードをトリガーしたりLazyInitializationExceptionを取得したりすることなく、HibernateプロキシオブジェクトからマーケットのIDにアクセスできます。その後、マーケット自体をロードするときに、そのIDに基づいて通常のエンティティ検索を実行します。これがどのように機能するかについての詳細な説明はここで読むことができます。

于 2013-02-07T05:48:48.900 に答える
0

新しいトランザクションについて言及したので、おそらくスレッドに属する新しい休止状態のセッションで作業することになります。

Hibernateセッションと直接対話する場合にこれを使用します

   obj = session.merge(obj);

JPA2Apiを使用している場合

   obj=   entityManager.merge(obj);

役に立ったら答えを評価してください。乾杯

于 2013-02-06T10:46:31.747 に答える