java - 使用纯 JPA 和 Spring 在 View 中打开 session - 而不是 Hibernate session

标签 java spring hibernate jpa lazy-loading

我正在创建一个使用 JPA 进行数据访问的 Java EE 应用程序。最初我使用 EclipseLink,但它通过 Moxy 依赖的捆绑 Geronimo Javamail 实现给了我一些奇怪的问题,而且我无法强制它使用 Sun Javamail,因此我改用 Hiberate 作为 JPA 提供程序。

EclipseLink 忽略了惰性/急切注释,它急切地加载所有内容。 Hibernate 会关注这些注释,因此不会加载依赖对象。这意味着,如果我加载一个人,并延迟加载该人的 parent ,如果我在 View 中访问 parent ,它不是延迟加载的,我会收到一个异常,表示数据库 session 已关闭。

我知道有两种方法可以解决这个问题: - 在 View 模式/反模式中打开 session (从分层的角度来看这不是很好,并且可能存在 N+1 数据库调用问题,但很简单) - 具有加载 View 所需的所有数据的服务方法(这使得服务层因大量重复方法来获取不同数量的数据而变得困惑)

作为引用,我的层是 View -> Controller -> 服务 -> 实体对象 -> JPA。我没有 dto,因为它是一个小应用程序,而且我不喜欢 DTO 反模式。

考虑在 View 模式中打开 session ,问题是 OpenSessionInViewInterceptor 和 OpenSessionInViewFilter 都是 Hibernate 特定的,并且都要求您在 Spring 配置文件上声明 hiberate session 。我更喜欢使用纯 JPA,并使用 persistence.xml 文件进行配置。

我有什么选择?我是否可以更改 Spring 配置以显式加载 Hibernate,然后在应用程序中使用纯 JPA?是否有一种纯 JPA 方式可以达到相同的结果,即从 View 中延迟加载?

最佳答案

  • EclipseLink 忽略标准 JPA 注释听起来很奇怪。
  • javamail 实现不应与 JPA 有任何关系
  • OpenEntityManagerInViewX (过滤器/拦截器)可以处理 JPA 的相同场景
  • 如果您明智地声明和使用您的集合,您可以轻松地摆脱这种模式。

关于java - 使用纯 JPA 和 Spring 在 View 中打开 session - 而不是 Hibernate session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11620189/

相关文章:

java - 创建 SOAP 网络服务客户端的方法

java - 无法解析为 jodatime

java - 停止 <任务 :scheduler> tasks

java - 无法解析辅助功能服务类中的 getIntent() 方法

spring - 如何将 Spring Boot 2.6.X 与 Actuator 依赖项和 Swagger Starter 3.0.0 融为一体

Spring HTTP 缓存管理

java - 设置 Spring REST Controller 欢迎文件

java - sql 问题 - java.sql.SQLException : Operand should contain 1 column(s) (once

java - 使用Spring hibernate mongodb进行审计

java - Hibernate EntityManager 不会在持久化时抛出 EntityExistsException