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