我正在使用 hibernate 3.6,XML 中的映射。
从以下架构开始。
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 需要更新它们的索引。所以我希望在 saveOrUpdate() 之前将我的第 3 步更改为 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 中没有任何“非标准”,但只是列出这 3 行以防 1 线程 org.hibernate.cache.NoCacheProvider
我希望有足够的代码来演示会话的使用。发布了这个,我想知道拦截器是否可能影响会话管理?