2015-08-22 55 views
1

在我的DAO類,讓我們說,我有實體管理器「時間」做出來的實體管理器工廠的,在這之後的代碼去如下: -由實體管理器管理的實體在堆內存中有2個對象嗎?

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個對象。一個由程序引用處理,另一個由Entity Manager實例處理。

這正是我想澄清的!

回答

2

將實體添加到List時會發生什麼?該列表只是對實體的引用。持久化上下文是一樣的。它保持對管理實體的引用。它知道一個實體被管理,因爲該實體在其被管理實體的集合中。

+0

這是在Hibernate的情況下稱爲第一級緩存的引用?請澄清 –

+0

會話,即對被管理實體的引用的集合,是第一級緩存。 –

+0

所以它意味着堆中只有一個對象,並且在持續之後,實體管理器具有對該對象的引用。所以我所理解的是,Entity Manager有一個引用的實體屬於'Persistence Context',它們被稱爲JPA和Hibernate中的Managed狀態,以及Hibernate中的第一級緩存。感謝你的回答! –