更新JPA实体的多个版本

时间:2015-05-27 09:43:53

标签: hibernate jpa ejb eclipselink

背景 - >我有一个员工表,代码中有许多JPA实体 - EmployeeBasic和EmployeeDetails。 这些JPA实体中的每一个都有不同级别的详细信息 - 基本实体只有员工姓名和ID。除了名称和ID之外,详细实体还有其他详细信息,如startdate,department等。

现在出现问题 - >我在代码中有一个位置,它使用EmployeeBasic实体更新实体的名称。在代码的另一部分中,正在使用EmployeeDetails实体。但是,它不会自动与更新的名称同步。有没有办法在JPA中处理它,以便两个版本的实体同步?

2 个答案:

答案 0 :(得分:0)

不,JPA / Hibernate中没有这样的行为。

无法自动同步,因为Hibernate在刷新时间之前不知道对象修改。因此,当您更改EmployeeBasic的名称时,Hibernate在脏检查之前不会注意到它。

但是,我认为无论如何都不能做出类似的设计。最好的方法是将映射到同一个表(行)的所有不同实体统一到一个实体中,这样持久化上下文永远不会处于与DB和其他实体相关的不一致状态。

答案 1 :(得分:0)

JPA允许在不同的层进行缓存,因此即使所有进程都使用相同的Employee实体,也需要仔细设计以确保所有进程自动与更新的名称同步。这样做的原因是EntityManager意味着要进行事务处理;从中读取将为您提供实体的托管实例,然后这些实体与其他EntityManagers中所做的更改隔离开来。在编写时,数据库中的数据只是一个问题。这允许您处理它们而不必担心数据从您下面变更,并自己管理任何问题(建议使用某种形式的乐观锁定)。

虽然EmployeeBasic和EmployeeDetails可以重用相同的数据库表,但是你的情况也很复杂,JPA也允许共享缓存。因此,对EmployeeBasic进行更改将更新其缓存和共享缓存,但EmployeeDetails缓存将过时。这类似于让多个持久性单元访问相同的表。

处理方式是应用程序负责并可以控制何时刷新实体,缓存级别和缓存失效。 JPA允许关闭共享缓存(使用隔离缓存),因此当您从新的EntityManager读取时,它将始终转到数据库以获取数据,并查看任何实体中的更改。它还具有刷新API(并且大多数提供程序都有刷新提示),当您知道可能需要检查某些内容时,可以强制查询数据库,但必须小心,因为它消除了更改。

EclipseLink(我不熟悉Hibernate)具有可与事件一起使用的缓存失效选项和缓存协调,因此您可以利用共享缓存;您可以使用更新事件来触发与更新的相关的所有Employee **缓存以使其失效。