没有会话的Hibernate FetchType.LAZY

时间:2015-07-03 09:45:48

标签: java spring hibernate orm lazy-initialization

我在Spring网络应用程序中遇到LazyLoadingException的许多问题,无论我在哪里尝试访问使用FetchType.LAZY注释的字段

Spring中没有配置会话,因为要求API应该是无状态的。

所有服务层方法都正确设置了@Transactional个注释。 但是,当我尝试访问任何域对象上的Lazy字段时,我得到了着名的LazyInitializationException (...) could not initialize proxy - no Session

我认为当我使用@Transactional方法时,Hibernate会在需要时自动加载惰性字段,但看起来它并没有。

我花了好几天寻找答案,但没有什么能满足我的需求。我发现可以使用openSessionInViewFilter配置Spring,但它似乎会引起很多问题,而且我没有任何会话。

如何使用这种无状态API在@Transactional带注释的服务方法中自动加载延迟字段?

我确定我在这里遗漏了一些明显的东西,但我对Spring和Hibernate并不是很熟悉。

请告诉我,如果我的问题中缺少信息,我应该给你。

1 个答案:

答案 0 :(得分:1)

LazyInitializationExceptions代码气味的方式同样EAGER fetching

首先,提取策略应该基于业务案例查询。 Tha DAO层独自负责获取正确的关联,因此:

  1. 您应该对所有FETCH关联使用many-to-one指令,并且最多只能使用一对多关联。如果您尝试加入FETCH多个一对多关联,您将获得笛卡尔积,并且您的应用程序性能将受到影响。

  2. 如果您需要获取多个集合,则multi-level fetching更合适。

  3. 您应该问自己为什么要从DAO层返回实体。使用DTO是一种更好的选择,因为它减少了从数据库中提取的数据量,并且它不会将实体抽象泄漏到UI层中。