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