【发布时间】:2015-07-02 13:09:03
【问题描述】:
我不明白为什么会这样。根据代码路径,当引发此异常时,我应该在同一个线程中并且会话应该存在。
有人可以告诉我这里缺少什么吗?
我已经设置好了
<property name="hibernate.current_session_context_class">thread</property>
在 hibernate.cfg.xml 文件中
我在 Servlet 过滤器中创建了以下代码
try{
factory.getCurrentSession().beginTransaction();
httpRequest.getRequestDispatcher("/public/index.html").forward(httpRequest,response);
}finally{
factory.getCurrentSession().getTransaction().commit();
}
在 index.xhtml 文件中,我有以下调用:
做一些事情
index.xhtml 正在使用模板,该模板使用 ui 包含来加载 menu.xhtml 文件。菜单文件然后插入菜单列表。 从 menuItemsViewController 调用 servicesMenuItems 最终会出现以下代码
public Collection<Bulletin> getBulletin(User bean){
Session session=factory.getCurrentSession();
try{
session.refresh(bean);
if(bean.getObligations().size()>0){
do some stuff
}
如您所见,会话存在,当session.refresh(bean) 没有抛出异常但bean.getObligations() 正在抛出时,
延迟初始化角色集合失败: data.User.obligations,无法初始化代理 - 没有会话”
有什么想法吗?
【问题讨论】:
-
当延迟初始化的对象在事务边界之外尝试时,就会发生该异常。您需要精确初始化延迟初始化的对象,以便在事务边界之外使用它们。摆脱异常的方法之一是使用 fetch joins。您还可以滥用我从未想过使用的 Eager fetch 类型。另一方面,JSF 与这个问题完全无关。
标签: hibernate jsf hibernate-session