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 行をリストするだけです
セッションの使用法を示すのに十分なコードであることを願っています。これを投稿して、インターセプターがセッション管理に影響を与える可能性があるかどうか疑問に思っていますか?