使用纯JPA和Spring打开会话 - 而不是Hibernate会话

时间:2012-07-23 20:40:48

标签: java spring hibernate jpa lazy-loading

我正在创建一个使用JPA进行数据访问的Java EE应用程序。最初我使用的是EclipseLink,但它依赖于Moxy的捆绑的Geronimo Javamail实现给了我一些奇怪的问题而且我无法强迫它使用Sun Javamail,所以我已经切换到Hiberate作为JPA提供者

EclipseLink忽略了懒惰/急切的注释,它急切地加载了所有东西。 Hibernate关注那些注释,因此不会加载依赖对象。这意味着如果我加载一个人,加上父亲的延迟加载,如果我在视图中访问父母并没有延迟加载,我会得到一个例外,说数据库会话已关闭。

我知道有两种方法可以解决这个问题:   - 在视图模式/反模式中打开会话(从分层的角度来看,它不是很好,并且可能有N + 1数据库调用问题,但很容易)   - 具有加载视图所需的所有数据的服务方法(这使得服务层混乱,有大量重复方法来获取不同数量的数据)

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

考虑View模式中的Open Session,问题是OpenSessionInViewInterceptor和OpenSessionInViewFilter都是特定于Hibernate的,并且都要求你在Spring配置文件上声明一个hiberate会话。我更喜欢使用纯JPA,配置了persistence.xml文件。

我有什么选择?我可以只更改我的Spring配置以显式加载Hibernate,然后在我的应用程序中使用纯JPA吗?是否有纯粹的JPA方式实现相同的结果,从视图中延迟加载?

1 个答案:

答案 0 :(得分:2)

  • 听起来很奇怪,EclipseLink忽略了标准的JPA注释。
  • javamail实现不应与JPA
  • 有任何关联
  • OpenEntityManagerInViewX(过滤器​​/拦截器)处理JPA
  • 的相同场景
  • 如果你明智地宣布和使用你的收藏品,你可以很容易地没有这种模式。