2

我们的应用程序由三部分组成:
1. 一个核心模块,它包含模型和DAO 类以及spring 配置。
2.一个web模块,使用core包,在(门户)web环境中执行。
3.一个tasks模块,同样使用core包,作为定时任务执行(无web上下文)

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

但是,如何在任务模块中通过这些修改重用相同的核心包?没有过滤器可以控制 EntityManager 的生命周期。

4

1 回答 1

2

OpenEntityManagerInViewFilter通常用于补充Spring 事务管理,如下:

  • 您在代码中定义事务边界。在事务中,您可以使用EntityManager注入@PersistenceContext(或从 获取的 Hibernate 会话getCurrentSession())。事务还定义了 JPA工作单元,即您在事务中对持久对象所做的所有更改都将自动传送到数据库。

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

如您所见,OpenEntityManagerInViewFilter它充当了缺席事务的替代品,因此OpenEntityManagerInViewFilter如果您在事务范围内执行,您可以运行相同的代码。因此,您需要适当地定义事务,以确保任务模块中所有与持久性相关的代码都在事务中运行。

于 2012-09-19T10:12:43.700 回答