2011-01-31 113 views
0

我只是一个spring + hibernate初学者。我正在做一个简单的项目,并为事务,简单的服务,简单的道和所有注释的bean设置了eveything。春季休眠关于延迟加载的错误

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

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

查询似乎做工精细,但我得到的时候查看尝试读取属性讨厌异常(字符串):

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

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

INFO:类型的豆“mySessionFactory这个” [类org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean]是不符合所有BeanPostProcessor的得到处理方式(例如:不符合自动代理)

什么这一切意味着什么?

回答

4

你有几个,选项我看到它

  • 力不被延迟加载的对象(例如,设置你的持久注解fetch=FetchType.EAGER)的方式。
  • OpenSessionInViewFilter
  • 在您的视图中调用它们之前,在数据层调用您的例程的方法(加载值)。

[编辑]这似乎并没有像我最初建议的那样工作。

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

*使用`@ Transactional`注释你的控制器例程*是否有效?这个观点超出了控制者的范围,不是吗? – 2011-01-31 17:54:45

+0

我试过一次,如果我没有记错的话,它的表现很好(虽然我的记忆可能很朦胧)。这当然假定您有事务扫描所需的全部弹簧配置。 – 2011-01-31 18:01:09

0

肖恩,

约翰的有关设置取= FetType.EAGER是你的最简单的解决建议。不过,您应该小心使用此解决方案。有时你可以通过修改你的DAO查询做一个LEFT JOIN对你感兴趣的相关实体获取解决您的问题如:

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

org.hibernate.Hibernate中-class有一些方便的静态实用方法例如参见Hibernate.initialize。尽管如此,你仍然需要一个公开的会话。正如其他答案中所建议的那样,最简单的方法可能是使用OpenSessionInViewFilter,设置提取类型为急切或修改查询来加载懒惰关系。