【问题标题】:LazyInitializationException with @Transactional annotation in MessageConverter在 MessageConverter 中带有 @Transactional 注释的 LazyInitializationException
【发布时间】:2011-02-18 03:05:10
【问题描述】:

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

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

每当我从绑定在我的应用程序上下文中的org.springframework.http.converter.json.MappingJacksonHttpMessageConverter 中调用 HTTP 方法时,我都是 org.hibernate.LazyInitializationException@Transactional 注解对MessageConverter 也有效吗?

【问题讨论】:

    标签: model-view-controller hibernate spring


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您的转换器类显然正在读取配置为在您的 Hibernate 配置中延迟收集的字段。

      两种可能的解决方案:

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

      【讨论】:

      • 我已经通过执行您的第一个建议解决了我的问题。实际上问题是我用于映射对象的另一个工具复制了persistbags而不是真正的集合......
      • 我在这里遇到了同样的问题,请问你是怎么做到的?你是如何扩展你的交易方式的?
      猜你喜欢
      • 2014-07-15
      • 2022-01-02
      • 1970-01-01
      • 2011-03-20
      • 2015-10-03
      • 2017-02-23
      • 2013-07-20
      • 2019-07-11
      • 1970-01-01
      相关资源
      最近更新 更多