JPA实体的状态变化是如何被跟踪的?

3
当我使用java.persistence.EntityManger.find()查找@Entity时,EntityManager会检查事务是否存在其关联持久化上下文的现有实例。 如果存在,则: - 如果正在搜索的实体存在于上下文中,则返回该实体。 - 如果正在搜索的实体不存在于上下文中,则从数据源获取它并将其放在上下文中,然后返回该实体。
如果事务不包含管理器关联持久化上下文的现有实例,则管理器将创建一个新的上下文,并将其与事务相关联,从数据源查找实体并将其添加到该上下文进行管理,然后将该实体返回给find的调用方。
结果相同,即调用者现在拥有一个存在于持久化上下文中的托管实体。重要的是,持久化上下文附加到事务,因此如果在客户端获得“托管”实体时事务已结束,那么持久性上下文就不存在了,该实体将变为“分离”,不再受管理。
现在,当我使用@entity实例上的setter或其他内部状态更改方法进行状态更改时,这些更改会被跟踪,因为我的实体是持久化上下文的一部分,在事务最终提交时,该上下文将刷新到数据源中。问题是如何跟踪状态更改以及由什么来跟踪?如果我通过某些中介对象进行更改,则该中介对象可以相应地更新持久化上下文,但我没有这样做。 我是直接使用我的@entity注释对象进行更改。那么这些更改是如何被跟踪的呢?也许有事件正在被监听?由谁来监听?我正在阅读有关此主题的书籍和文章,但无法确定这一点。

1
它被称为“脏检查”。现在,将这个新学的关键词与“jpa”或“hibernate”或您正在使用的任何其他实现作为附加关键词一起输入谷歌。它是否产生了有用的答案?通常它归结为代理模式。 - BalusC
可能是重复问题:https://dev59.com/f17Va4cB1Zd3GeqPIUuv - BalusC
1个回答

3
状态的改变在实体的生命周期中由jpa供应商的内部实现进行跟踪。
脏检查策略是供应商特定的,可以通过比较字段或字节码增强(如JPA dirty checking中所示)来实现。
虽然它是供应商特定的,但在状态同步时,在刷新或提交时PersistentContext会注意到状态的改变。
重要的是要记住所有可以进行刷新的点:
  • 手动
  • 查询之前
  • 提交之前

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接