如何在(OpenEntityManagerInView)Web环境内外使用相同的DAO?

时间:2012-09-19 09:45:34

标签: java spring jpa

我们的申请包括三个部分:
 1. 核心模块,包含模型和DAO类以及弹簧配置  2. web 模块,它使用核心包并在(门户)Web环境中执行  3. 任务模块,它也使用核心包并作为计划任务执行(无Web上下文)

我们尝试为Web模块引入带有Spring Filter的OpenEntityManagerInView模式。据我所知,DAO不能关闭EntityManager,因为过滤器会这样做。此外,我会用EntityManager@PersistenceContext而不是EntityManagerFactory注入@PersistenceUnit(是吗?)。

但是如何在 tasks 模块中重用相同的核心包并进行这些修改?没有Filter可以控制EntityManager的生命周期。

1 个答案:

答案 0 :(得分:2)

OpenEntityManagerInViewFilter通常用于补充Spring transaction management,如下所示:

  • 您可以在代码中定义事务边界。在交易中,您可以使用EntityManager注入@PersistenceContext(或从getCurrentSession()获得的Hibernate会话)。事务也定义了JPA Units of Work,即您在事务中对持久对象所做的所有更改都将自动转移到数据库中。

  • 但有时您需要在定义的事务之外访问数据库(最值得注意的情况是在呈现视图时延迟加载)。对于这种情况,您有OpenEntityManagerInViewFilter,允许您访问数据库并在HTTP请求处理期间的任何时候使用@PersistenceContext

如您所见,OpenEntityManagerInViewFilter充当缺席事务的替代,因此如果您在事务范围内执行此操作,则可以在没有OpenEntityManagerInViewFilter的情况下运行相同的代码。因此,您需要适当地定义transactons,以确保 tasks 模块中所有与持久性相关的代码在事务中运行。