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實例處理。
這正是我想澄清的!
這是在Hibernate的情況下稱爲第一級緩存的引用?請澄清 –
會話,即對被管理實體的引用的集合,是第一級緩存。 –
所以它意味着堆中只有一個對象,並且在持續之後,實體管理器具有對該對象的引用。所以我所理解的是,Entity Manager有一個引用的實體屬於'Persistence Context',它們被稱爲JPA和Hibernate中的Managed狀態,以及Hibernate中的第一級緩存。感謝你的回答! –