2016-02-26 51 views
2

当I java.persistence.EntityManger.find()是一个@Entity时,EntityManager会检查事务是否存在与其关联的持久性上下文的现有实例。如果如果搜索的是存在于上下文中的实体中的一个存在,那么如何对JPA实体进行实际跟踪

  1. ,那就是如果被搜索的实体是什么返回EntityManager.find
  2. 的主叫方不存在背景,然后从EntityManager的数据源得到它,并把它在那里,然后就是什么返回到EntityManager.Find

的呼叫者,而如果交易不包含经理的相关持久化上下文的现有实例,那么管理者创建一个,将其与事务相关联,在数据源中找到该实体,并将其添加到该上下文中进行管理,然后将该实体返回给find的调用者。

- >结果是相同的,调用者现在有一个存在于持久化上下文中的托管实体。 (重要的是:持久性上下文被附加到事务中,所以如果事务在客户端获得了“被管理”实体的地方结束,那么持久化上下文不再是实体,并且该实体被“分离”了不再管理)。

现在,当我在@entity实例中使用setter或其他内部状态更改方法进行状态更改时,会跟踪这些更改,因为我的实体是持久性上下文的一部分,当事务最终提交时它将被刷新到数据源。我的问题是如何跟踪状态变化并通过什么进行跟踪?如果我通过某个中间对象进行更改,则该中间对象可以相应地更新持久化上下文,但我不是(或者我?)。我直接使用我的@entity注释对象进行更改。那么如何跟踪这些变化。

也许有些事件正在被聆听?听什么?我正在阅读关于这个主题的书籍和文章,但是我不能把这一点搞砸。

+1

这就是所谓的“脏检查”。现在,将新学习的关键字与“jpa”或“hibernate”或任何您正用作附加关键字的impl结合使用。它有没有产生有益的答案?一般来说,它归结为代理模式。 – BalusC

+0

谢谢。完善。 – naftalimich

+0

可能的重复:http://stackoverflow.com/questions/8507922/jpa-dirty-checking – BalusC

回答

3

在实体生命周期中,jpa供应商的内部实现跟踪状态更改。

脏检查策略是供应商特定的。可以通过字段比较或字节码增强来完成,如发布在JPA dirty checking中。

尽管它是特定于供应商的,但PersistentContext会在状态同步期间,在刷新或提交时注意到状态更改。

重要的是要记住刷新可以做所有的点是非常重要的:

  • 手动
  • 之前查询
  • 之前提交