我正在创建一个使用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方式实现相同的结果,从视图中延迟加载?
答案 0 :(得分:2)
OpenEntityManagerInViewX
(过滤器/拦截器)处理JPA