没有会话的休眠 FetchType.LAZY
Hibernate FetchType.LAZY without session
在 Spring 网络应用程序中,无论我尝试访问用 FetchType.LAZY
注释的字段,我都会遇到很多关于 LazyLoadingException
的问题
Spring 中没有配置会话,因为要求 API 应该是无状态的。
所有服务层方法都正确设置了 @Transactional
注释。
但是,当我尝试访问任何域对象上的惰性字段时,我得到了著名的 LazyInitializationException (...) could not initialize proxy - no Session
我认为当我在 @Transactional
方法中时,Hibernate 会在需要时自动加载惰性字段,但它似乎没有。
我花了几天时间寻找答案,但没有一个符合我的需要。我发现 Spring 可以用 openSessionInViewFilter 配置,但它似乎会导致很多问题,而且我没有任何会话。
如何使用这种无状态 API 在 @Transactional
带注释的服务方法中自动加载惰性字段?
我确定我在这里遗漏了一些明显的东西,但我对 Spring 和 Hibernate 不是很熟悉。
如果我的问题中有遗漏的信息,请告诉我,我应该给你。
LazyInitializationExceptions
是一种代码味道,同样 EAGER fetching 也是。
首先,抓取策略应该是基于业务案例的查询。 Tha DAO 层全权负责获取正确的关联,因此:
您应该对所有 many-to-one
关联使用 FETCH
指令,并且最多为一个一对多关联。如果您尝试 JOIN FETCH 多个一对多关联,您将获得笛卡尔积并且您的应用程序性能将受到影响。
如果需要取多个集合,那么multi-level fetching比较合适。
你应该问问自己为什么要 return 来自 DAO 层的实体。使用 DTO 是一个更好的选择,因为它减少了从数据库中获取的数据量,并且不会将实体抽象泄漏到 UI 层中。
在 Spring 网络应用程序中,无论我尝试访问用 FetchType.LAZY
LazyLoadingException
的问题
Spring 中没有配置会话,因为要求 API 应该是无状态的。
所有服务层方法都正确设置了 @Transactional
注释。
但是,当我尝试访问任何域对象上的惰性字段时,我得到了著名的 LazyInitializationException (...) could not initialize proxy - no Session
我认为当我在 @Transactional
方法中时,Hibernate 会在需要时自动加载惰性字段,但它似乎没有。
我花了几天时间寻找答案,但没有一个符合我的需要。我发现 Spring 可以用 openSessionInViewFilter 配置,但它似乎会导致很多问题,而且我没有任何会话。
如何使用这种无状态 API 在 @Transactional
带注释的服务方法中自动加载惰性字段?
我确定我在这里遗漏了一些明显的东西,但我对 Spring 和 Hibernate 不是很熟悉。
如果我的问题中有遗漏的信息,请告诉我,我应该给你。
LazyInitializationExceptions
是一种代码味道,同样 EAGER fetching 也是。
首先,抓取策略应该是基于业务案例的查询。 Tha DAO 层全权负责获取正确的关联,因此:
您应该对所有
many-to-one
关联使用FETCH
指令,并且最多为一个一对多关联。如果您尝试 JOIN FETCH 多个一对多关联,您将获得笛卡尔积并且您的应用程序性能将受到影响。如果需要取多个集合,那么multi-level fetching比较合适。
你应该问问自己为什么要 return 来自 DAO 层的实体。使用 DTO 是一个更好的选择,因为它减少了从数据库中获取的数据量,并且不会将实体抽象泄漏到 UI 层中。