当我使用java.persistence.EntityManger.find()一个@Entity时,EntityManager会在Transaction中检查其关联的持久性上下文的现有实例。如果存在,那么
并且,如果事务不包含管理器关联的持久性上下文的现有实例,则管理者创建一个实例,将其与事务关联,在数据源中找到实体,然后将其添加到该上下文中进行管理,然后返回该实体给寻找者。
->结果是相同的,因为调用方现在具有一个存在于持久性上下文中的托管实体。(重要:持久性上下文已附加到事务中,因此,如果事务已在客户端获得“托管”实体的那一刻结束,那么持久性上下文将不再存在,并且该实体将“分离”不再管理)。
现在,当我在@entity实例上使用setter或其他内部状态更改方法进行状态更改时,将跟踪这些更改,因为我的实体是持久性上下文的一部分,当事务最终提交时,该持久性上下文将刷新到数据源。我的问题是如何跟踪状态变化以及如何跟踪?如果我通过某个中介对象进行更改,那么该中介对象可以相应地更新持久性上下文,但是我不是(或者是?)。我使用我的@entity注释对象直接进行更改。那么如何跟踪这些变化。
也许有正在监听的事件?听什么了?我正在阅读有关该主题的书籍和文章,但我无法将这一点固定下来。
在实体的生命周期内,状态更改由jpa供应商的内部实现跟踪。
脏检查策略是特定于供应商的。可以通过字段比较或字节码增强(例如在JPA脏检查中发布)来完成。
尽管它是特定于供应商的,但PersistentContext将在状态同步期间(在刷新或提交时)知道状态更改。
重要的是要记住所有可以进行冲洗的点:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句