我正在创建一个使用 JPA 进行数据访问的 Java EE 应用程序。最初我使用 EclipseLink,但它依赖于 Moxy 的捆绑 Geronimo Javamail 实现给我带来了一些奇怪的问题,我无法强制它使用 Sun Javamail,因此我切换到 Hiberate 作为 JPA 提供程序。
EclipseLink 忽略了惰性/渴望注释,它急切地加载所有内容。Hibernate 会注意这些注释,因此不会加载依赖对象。这意味着如果我加载一个人,延迟加载人的父母,如果我在视图中访问父母,它不是延迟加载,我会得到一个异常,说数据库会话已关闭。
我知道有两种方法可以解决这个问题: - 在视图模式/反模式中打开会话(从分层的角度来看这不是很好,并且可能有 N+1 数据库调用问题,但很容易) - 有服务加载视图需要的所有数据的方法(这使得服务层混乱,有很多重复的方法来获取不同数量的数据)
作为参考,我的层是 View -> Controller -> Service -> Entity Object -> JPA。我没有 dto,因为它是一个小应用程序,而且我不喜欢 DTO 反模式。
考虑 View 模式中的 Open Session,问题在于 OpenSessionInViewInterceptor 和 OpenSessionInViewFilter 都是特定于 Hibernate 的,并且都需要您在 Spring 配置文件上声明一个休眠会话。我更喜欢使用配置有 persistence.xml 文件的纯 JPA。
我在这里有什么选择?我可以更改我的 Spring 配置以显式加载 Hibernate,然后在我的应用程序中使用纯 JPA 吗?是否有一种纯 JPA 方式可以实现相同的结果,从视图中延迟加载?