我只是一个春天+休眠初学者。我正在做一个简单的项目,我为事务设置了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处理(例如:不符合自动代理条件)
这一切意味着什么?
答案 0 :(得分:4)
你有一些选择我的方式
fetch=FetchType.EAGER
)。 [编辑]这根本不像我最初建议的那样起作用。
@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设置为急切或修改查询以加载惰性关系,如其他答案所示。