我们的申请包括三个部分:
1. 核心模块,包含模型和DAO类以及弹簧配置
2. web 模块,它使用核心包并在(门户)Web环境中执行
3. 任务模块,它也使用核心包并作为计划任务执行(无Web上下文)
我们尝试为Web模块引入带有Spring Filter的OpenEntityManagerInView模式。据我所知,DAO不能关闭EntityManager,因为过滤器会这样做。此外,我会用EntityManager
而@PersistenceContext
而不是EntityManagerFactory
注入@PersistenceUnit
(是吗?)。
但是如何在 tasks 模块中重用相同的核心包并进行这些修改?没有Filter可以控制EntityManager的生命周期。
答案 0 :(得分:2)
OpenEntityManagerInViewFilter
通常用于补充Spring transaction management,如下所示:
您可以在代码中定义事务边界。在交易中,您可以使用EntityManager
注入@PersistenceContext
(或从getCurrentSession()
获得的Hibernate会话)。事务也定义了JPA Units of Work,即您在事务中对持久对象所做的所有更改都将自动转移到数据库中。
但有时您需要在定义的事务之外访问数据库(最值得注意的情况是在呈现视图时延迟加载)。对于这种情况,您有OpenEntityManagerInViewFilter
,允许您访问数据库并在HTTP请求处理期间的任何时候使用@PersistenceContext
。
如您所见,OpenEntityManagerInViewFilter
充当缺席事务的替代,因此如果您在事务范围内执行此操作,则可以在没有OpenEntityManagerInViewFilter
的情况下运行相同的代码。因此,您需要适当地定义transactons,以确保 tasks 模块中所有与持久性相关的代码在事务中运行。