Java 关于延迟加载的Spring hibernate错误

Java 关于延迟加载的Spring hibernate错误,java,hibernate,spring,Java,Hibernate,Spring,我只是一个春季+冬眠的初学者。我正在做一个简单的项目,我为事务、简单的服务、简单的dao和所有带注释的bean设置了一切 使用list works,我可以使用条件查询列出对象及其属性。但是,如果我尝试用以下内容加载对象: Session sess = sessionFactory.getCurrentSession(); Ordine res = (Ordine) sess.load(Ordine.class, id); return res; 查询似乎工作正常,但当视图尝试读取属性(字符串)

我只是一个春季+冬眠的初学者。我正在做一个简单的项目,我为事务、简单的服务、简单的dao和所有带注释的bean设置了一切

使用list works,我可以使用条件查询列出对象及其属性。但是,如果我尝试用以下内容加载对象:

Session sess = sessionFactory.getCurrentSession();
Ordine res = (Ordine) sess.load(Ordine.class, id);
return res;
查询似乎工作正常,但当视图尝试读取属性(字符串)时,我遇到了一个严重的异常:

org.hibernate.LazyInitializationException:无法初始化代理-无会话

我甚至注意到这是启动日志:

信息:类型为[class org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean]的Bean“mySessionFactory”不符合由所有BeanPostProcessor处理的条件(例如:不符合自动代理的条件)


这一切意味着什么?

你可能需要使用

你可能需要使用

在我看来,你有一些选择

  • 强制不延迟加载对象(例如,在持久性批注上设置
    fetch=FetchType.EAGER
  • 在视图中调用例程之前,在数据层中调用例程的方法(以加载值)
[编辑]这似乎根本不像我最初建议的那样有效

  • 加上。使用
    @Transactional
    注释控制器例程
      在我看来,你有一些选择

      • 强制不延迟加载对象(例如,在持久性批注上设置
        fetch=FetchType.EAGER
      • 在视图中调用例程之前,在数据层中调用例程的方法(以加载值)
      [编辑]这似乎根本不像我最初建议的那样有效

      • 加上。使用
        @Transactional
        注释控制器例程
          肖恩

          Johan关于设置fetch=FetType.EAGER的建议是最简单的解决方案。不过,使用此解决方案时应该小心。有时,您可以通过修改dao查询来解决问题,对感兴趣的相关实体执行左连接获取。例如:

          Query q = this.em.createQuery("select x from PrimaryEntity x \n"
          + "left join fetch x.secondaryEntityField \n "
          + "where x.selectionProperty = :selection");
          
          肖恩

          Johan关于设置fetch=FetType.EAGER的建议是最简单的解决方案。不过,使用此解决方案时应该小心。有时,您可以通过修改dao查询来解决问题,对感兴趣的相关实体执行左连接获取。例如:

          Query q = this.em.createQuery("select x from PrimaryEntity x \n"
          + "left join fetch x.secondaryEntityField \n "
          + "where x.selectionProperty = :selection");
          

          hibernate-class有一些方便的静态实用程序方法,例如,请参见。不过,您仍然需要一个开放的会话。最简单的方法可能是使用OpenSessionInViewFilter,将获取类型设置为“急切”,或修改查询以加载惰性关系,如其他答案中所建议的那样。

          org.hibernate.hibernate-类有一些方便的静态实用程序方法,例如,请参阅。不过,您仍然需要一个开放的会话。最简单的方法可能是使用OpenSessionInViewFilter,将获取类型设置为“急切”,或修改查询以加载惰性关系,正如其他答案中所建议的那样。

          使用
          @Transactional
          注释控制器例程,这样做有效吗?视图超出了控制器的作用域,不是吗?我试过一次,如果我没记错的话,它表现得很好(不过我的记忆可能有点模糊)。当然,这是假设您拥有事务扫描所需的所有spring配置。这个答案是正确的,减去@Transactional per Sean的注释。我尝试放置FetchType。急切,没有成功。我把OpenSessionInViewIntercepto。。。。没什么。我两个都试过了,可以验证它们是否有效。你能用更多的代码来说明你在做什么吗?例如,@OneToMany(…,fetch=…)?此外,当使用OSIV时,您应该将其放置在与控制器定义相同的appcontext中,例如,请参阅使用
          @Transactional
          注释控制器例程。这样做有效吗?视图超出了控制器的作用域,不是吗?我试过一次,如果我没记错的话,它表现得很好(不过我的记忆可能有点模糊)。当然,这是假设您拥有事务扫描所需的所有spring配置。这个答案是正确的,减去@Transactional per Sean的注释。我尝试放置FetchType。急切,没有成功。我把OpenSessionInViewIntercepto。。。。没什么。我两个都试过了,可以验证它们是否有效。你能用更多的代码来说明你在做什么吗?例如,@OneToMany(…,fetch=…)?此外,当使用OSIV时,您应该将其放置在与控制器定义相同的appcontext中,例如,请参见。嗯,肖恩没有问问题:-)嗯,肖恩没有问问题:-)