关于延迟加载的Spring hibernate错误

时间:2011-01-31 17:27:55

标签: java hibernate spring

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

使用列表工作,我可以使用Criteria查询列出对象及其属性。但是,如果我尝试加载一个对象:

Session sess = sessionFactory.getCurrentSession();
Ordine res = (Ordine) sess.load(Ordine.class, id);
return res;

查询似乎工作正常,但当View尝试读取属性(字符串)时,我得到一个令人讨厌的异常:

  

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

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

  

INFO:类型为[class org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean]的Bean'mySessionFactory'不适合所有BeanPostProcessors处理(例如:不符合自动代理条件)

这一切意味着什么?

4 个答案:

答案 0 :(得分:4)

你有一些选择我的方式

  • 强制您的对象不被懒惰加载(例如,在持久性注释上设置fetch=FetchType.EAGER)。
  • OpenSessionInViewFilter
  • 在视图中调用例程之前,在数据层中调用例程的方法(以加载值)。

[编辑]这根本不像我最初建议的那样起作用。

  • 添加transactions。使用@Transactional注释您的控制器例程。

答案 1 :(得分:0)

您可能需要使用OpenSessionInViewFilter

答案 2 :(得分:0)

肖恩,

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");

答案 3 :(得分:0)

org.hibernate.Hibernate -class有一些方便的静态实用方法,例如参见Hibernate.initialize。你仍然需要一个开放的会话。最简单的方法可能是使用OpenSessionInViewFilter,将fetch-types设置为急切或修改查询以加载惰性关系,如其他答案所示。