0

我正在使用 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

我希望有足够的代码来演示会话的使用。发布了这个,我想知道拦截器是否可能影响会话管理?

4

1 回答 1

0

你如何处理会话?在索引期间,会话必须仍然打开,以便索引器可以加载延迟加载的关联。在 webapps 中,Open Session In View 模式通常用于在整个请求期间打开一个会话。您需要发布一些更具体的代码以获得更具体的反馈。另一种方法是急切加载关联(可能不是一个好主意)。

于 2013-02-22T10:28:35.390 回答