实体管理器管理的实体在堆内存中有2个对象吗?

时间:2015-08-22 09:48:55

标签: jpa entity

在我的DAO课程中,假设我有一个实体经理'em'由实体经理工厂制作,之后的代码如下: -

CarEntity carEntity = new CarEntity;//line 1
carEntity.setName("XYZ");           //line 2

当我执行上面的代码行时,会在堆内存中创建一个对象,并在其中存储其实例变量“XYZ”的值。

现在考虑以下代码:

em.getTransaction().begin();
em.persist(carEntity);         //line 3

在第3行之后,如我们所知,carEntity对象进入托管状态。 在我刷新或提交事务之前,它不会转到数据库

那么实体经理如何知道实体已进入托管状态? 在line 3执行后是否为CarEntity创建了一个新对象? 或者它在堆中的内存位置是否有任何变化,表明它的状态从“新状态”变为“管理状态”?

AFAIK,处于托管状态的实体在持久上下文(也是堆的一个区域)中分配内存。这是否意味着内存再次分配给堆中的托管实体。

如果是这样,那就意味着托管实体在JVM的堆内存中有2个对象。一个由程序引用处理,另一个由实体管理器实例处理。

这正是我要澄清的内容!

1 个答案:

答案 0 :(得分:2)

将实体添加到List时会发生什么? List只是对实体的引用。持久化上下文也是如此。它保留对托管实体的引用。它知道实体是受管理的,因为该实体位于其托管实体集合内。