首页 文章

更新JPA实体的多个版本

提问于
浏览
0

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

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

2 回答

  • 0

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

    无法自动同步,因为Hibernate在刷新时间之前不知道对象修改 . 所以当你改变 EmployeeBasic 的名字时,Hibernate在脏检查之前不会注意到它 .

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

  • 0

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

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

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

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

相关问题