0

XMLでマッピングするhibernate 3.6を使用しています。

次のスキーマから始めます。

public class Card {
  @IndexedEmbedded
  private CardType cardType;

  private User user;//many-to-one
  ...
}

public class User {
  ...
  private int version;//Need to be strict about version on this table
  private Set<Card> cards = new HashSet<Card>();//cascade="all-delete-orphan"
  ...
}

次のことを行う場合:
1: 既存のユーザーをロードする
2: セッションを閉じる 、分離された状態のクライアント側で作業します。一時タグを追加します。
3: ユーザーをサーバーに戻す、openSession()、beginTransaction()、saveOrUpdate(user)、commit()。

「Hibernate Search でのインデックス作成中にエラーが発生しました (トランザクション完了前)」というエラーが表示されます ... 原因: org.hibernate.LazyInitializationException: プロキシを初期化できませんでした - セッションがありません

これまでのところ、これは私にとって理にかなっています。CardType と Card のインデックスを更新する必要があります。したがって、ステップ 3 を saveOrUpdate() の前に merge() に変更する予定です。

これを行うと、バージョンを含むすべてのプロパティが detached からセッション対応オブジェクトにコピーされます。もちろん、これは私の楽観的なロック戦略が失敗したことを意味します-バージョンの問題について警告されていません.

この状況で取るべき戦略とは?

--いくつかのセッション処理コードを示すために投稿を更新しました--

public synchronized static SessionFactory getSessionFactory() {
  if (sessionFactory == null) {
    final AuditLogInterceptor interceptor = new AuditLogInterceptor();
    Configuration configuration = new Configuration();
    configuration = configuration.configure("hibernate.cfg.xml");
    configuration.setInterceptor(interceptor);
    sessionFactory = configuration.buildSessionFactory();
    AbstractSessionAwareConstraintValidator.setSessionFactory(sessionFactory);
  }
  return sessionFactory;
}

このようなコードをテストします

sessionFactory = HibernateUtil.getSessionFactory();
sessionFactory.getCurrentSession().beginTransaction();
//Find user here
sessionFactory.getCurrentSession().getTransaction().commit();
sessionFactory.getCurrentSession().close();
//Edit User, add tags out of session. (not using OSIV)
sessionFactory.getCurrentSession().beginTransaction();
user = sessionFactory.getCurrentSession().merge();//Only works if I do this
sessionFactory.getCurrentSession().saveOrUpdate(entity);
sessionFactory.getCurrentSession().getTransaction().commit();
sessionFactory.getCurrentSession().close();

私の知る限り、私の hibernate.cfg.xml には「非標準」のものは何もありませんが、1 つのスレッド org.hibernate.cache.NoCacheProvider の場合にこれらの 3 行をリストするだけです

セッションの使用法を示すのに十分なコードであることを願っています。これを投稿して、インターセプターがセッション管理に影響を与える可能性があるかどうか疑問に思っていますか?

4

1 に答える 1

0

セッションをどのように処理しますか? インデックス作成中は、インデクサーが遅延読み込みされた関連付けを読み込むことができるように、セッションを開いたままにする必要があります。Web アプリケーションでは、多くの場合、Open Session In View パターンを使用して、リクエスト全体でセッションを開くことができます。より具体的なフィードバックを得るには、より具体的なコードを投稿する必要があります。別の方法は、アソシエーションを熱心にロードすることです (おそらく良い考えではありません)。

于 2013-02-22T10:28:35.390 に答える