在我的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个对象。一个由程序引用处理,另一个由实体管理器实例处理。
这正是我要澄清的内容!
答案 0 :(得分:2)
将实体添加到List时会发生什么? List只是对实体的引用。持久化上下文也是如此。它保留对托管实体的引用。它知道实体是受管理的,因为该实体位于其托管实体集合内。