【问题标题】:org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: could not initialize proxy - no Sessionorg.hibernate.LazyInitializationException:无法延迟初始化角色集合:无法初始化代理 - 无会话
【发布时间】: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,无法初始化代理 - 没有会话”

有什么想法吗?

【问题讨论】:

标签: hibernate jsf hibernate-session


【解决方案1】:

默认惰性属性为 true。这意味着休眠不会填充实体上的对象属性。在这种情况下,Hibernate 不会在 User bean 中填充 Obligation。当你尝试 get 义务时,会抛出异常。

Hibernate Eager vs Lazy Fetch Type

您可以更改惰性属性或必须自己填写义务。

【讨论】:

    【解决方案2】:

    好的..我解决了这个问题,但我仍然不知道是什么原因造成的...... 在仔细检查我的代码后,我注意到我正在将用户置于会话中......并且在第一次尝试时,一切正常,在第二次尝试浏览页面时,发出异常......

    每次我尝试访问该页面时,我都开始清除会话并将用户置于会话中。现在我不再看到异常...

    【讨论】:

      猜你喜欢
      • 2018-02-25
      • 2019-03-13
      • 1970-01-01
      • 2016-07-06
      • 2017-01-30
      • 1970-01-01
      • 2016-06-04
      • 2018-11-21
      • 2014-12-23
      相关资源
      最近更新 更多