每当我尝试访问使用 FetchType.LAZY
注释的字段时,我都会在 Spring Web 应用程序中遇到许多关于 LazyLoadingException
的问题
Spring 中没有配置 session ,因为要求 API 应该是无状态的。
所有服务层方法都正确设置了@Transactional
注释。
但是,当我尝试访问任何域对象上的 Lazy 字段时,我得到了著名的 LazyInitializationException (...) Could not initialize proxy - no Session
我认为当我使用 @Transactional
方法时,Hibernate 会在需要时自动加载惰性字段,但事实似乎并非如此。
我花了几天时间寻找答案,但没有任何符合我的需求。我发现 Spring 可以配置 openSessionInViewFilter 但它似乎会导致很多问题,而且我没有任何 session 。
如何使用这样的无状态 API 自动加载 @Transactional
带注释的服务方法中的惰性字段?
我确信我在这里遗漏了一些明显的东西,但我对 Spring 和 Hibernate 不太熟悉。
请告诉我我的问题中是否缺少我应该向您提供的信息。
最佳答案
LazyInitializationExceptions
也是一种代码味道 EAGER fetching也是。
首先,获取策略应该基于业务案例的查询。 Tha DAO 层单独负责获取正确的关联,因此:
您应该对所有
多对一
关联和最多一个一对多关联使用FETCH
指令。如果您尝试 JOIN FETCH 多个一对多关联,您将得到笛卡尔积,并且您的应用程序性能将受到影响。如果您需要获取多个集合,则 multi-level fetching比较合适。
您应该问自己为什么要从 DAO 层返回实体。使用 DTO 是一个更好的替代方案,因为它既减少了从数据库获取的数据量,又不会将实体抽象泄漏到 UI 层。
关于java - 没有 session 的 Hibernate FetchType.LAZY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31203658/