实体管理器管理的实体在堆内存中是否有 2 个对象?
Does entities managed by an Entity Manager have 2 objects in heap memory?
在我的 DAO class 中,比方说,我有实体管理器 '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 创建了一个新对象?
或者它在堆中的内存位置是否有任何变化,表示它的状态从 'new state' 更改为 'managed state'?
据我所知,处于托管状态的实体在持久上下文(也是堆区域)中分配内存。这是否意味着内存再次分配给堆中的托管实体。
如果是这样,则意味着托管实体在 JVM 的堆内存中有 2 个对象。一个由程序的引用处理,另一个由实体管理器实例处理。
这就是我要澄清的!
将实体添加到列表时会发生什么?该列表仅具有对实体的引用。对于持久性上下文来说也是一样的。它保留对托管实体的引用。它知道一个实体是托管的,因为该实体在其托管实体集合中。
在我的 DAO class 中,比方说,我有实体管理器 '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 创建了一个新对象?
或者它在堆中的内存位置是否有任何变化,表示它的状态从 'new state' 更改为 'managed state'?
据我所知,处于托管状态的实体在持久上下文(也是堆区域)中分配内存。这是否意味着内存再次分配给堆中的托管实体。
如果是这样,则意味着托管实体在 JVM 的堆内存中有 2 个对象。一个由程序的引用处理,另一个由实体管理器实例处理。
这就是我要澄清的!
将实体添加到列表时会发生什么?该列表仅具有对实体的引用。对于持久性上下文来说也是一样的。它保留对托管实体的引用。它知道一个实体是托管的,因为该实体在其托管实体集合中。