在MessageConverter中使用@Transactional注释的LazyInitializationException

时间:2010-05-11 12:20:22

标签: model-view-controller hibernate spring

我通过Spring-MVC公开了REST服务。我有一个特定的方法,它通过HTTP调用正确映射和调用。 My Spring应用程序包含HibernateTransactionManager,并且通过@Transactional - 注释配置事务。我注释了这样的方法:

@Transactional(readOnly = true)
@Override
@RequestMapping(value = "/start", method = RequestMethod.GET)
@ResponseBody
public List<SomeObject> start(....)

每当我从我的应用程序上下文中绑定的org.hibernate.LazyInitializationException中调用HTTP方法I org.springframework.http.converter.json.MappingJacksonHttpMessageConverter时。 @Transactional注释是否也适用于MessageConverter

2 个答案:

答案 0 :(得分:2)

LazyInitializationException表示您尝试在实体上读取未初始化数据时,您的休眠Session已关闭。

您可以通过以下方式解决此问题:

  • 延长会话的生命周期(使用OpenSessionInView
  • 使用Hibernate.initialize(entity)
  • 在您的服务方法中预初始化实体

答案 1 :(得分:2)

您的转换器类显然正在读取一个配置为在Hibernate配置中懒惰收集的字段。

两种可能的解决方案:

  • 展开您的交易方法以包含转换器方法。
  • 编辑您的Hibernate配置,以急切地获取负责LazyInitializationException的字段。 (例如,该字段可以是数据库中两个表之间关系的一部分。)