java - 没有 session 的 Hibernate FetchType.LAZY

标签 java spring hibernate orm lazy-initialization

每当我尝试访问使用 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 层单独负责获取正确的关联,因此:

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

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

  3. 您应该问自己为什么要从 DAO 层返回实体。使用 DTO 是一个更好的替代方案,因为它既减少了从数据库获取的数据量,又不会将实体抽象泄漏到 UI 层。

关于java - 没有 session 的 Hibernate FetchType.LAZY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31203658/

相关文章:

来自 Eclipse 的 Java 控制台

java - boolean (Boolean) - getter 是 vs get

java - 在基本服务上找不到符号

java - 在可能的情况下,是否应该消除 SQL 查询以支持使用 Hibernate?

java - java中如何从父类对象加载子对象

java - Google 电子表格更新列中的数据格式

java - 找不到符号方法 INFLATE ,android studio

eclipse - 运行 mvn install 时如何指定 spring.profiles.active

java - 用spring初始化和释放全局资源

java - Hibernate @OneToMany/@ManyToOne 列未找到