上篇我們簡單介紹了JPA EntityManager的基本操作,我們今天接著,更深1層次的介紹EntityManager。
1級聯(lián)操作
2實體狀態(tài)
3 數(shù)據(jù)同步
上次,我們只是持久了1個客戶實體,如果創(chuàng)建客戶的時候,一樣持久化客戶所對應(yīng)的地址實體,如何操作呢?JPA中提供了多種持久化帶關(guān)系的實體
首先看以下客戶與地址的關(guān)系
代碼
Cascade ,當(dāng)調(diào)用persist方法持久化客戶實體時
cascade = CascadeType.PERSIST,客戶所關(guān)聯(lián)的實體也自動時就化
持久化客戶實體
這樣,只需要持久化客戶實體,對應(yīng)固定實體也將自動持久化了,而不需要持久化兩次
實體屬性及加載方式
實體1旦通過find方法查詢后,實體的屬性可以有兩種方式加載,分別是 即時加載(EAGER)和惰性加載(LAZY),
fetch = FetchType.ELAZY懶加載
fetch = FetchType.EAGER即時加載
對LAZY加載,只有當(dāng)使用該實體屬性時,才履行查詢的SQl,將屬性加載進(jìn)來,如果不顯示的調(diào)用,該屬性用于也不會加載到客戶實體中,而且當(dāng)該實體具有多條數(shù)據(jù),使用懶加載,容易造成頻繁訪問數(shù)據(jù)庫,出現(xiàn) N+1問題。若數(shù)據(jù)量少,該方式還是1個很好的選擇,若以1種方式?jīng)]有絕對的好或不好
前面我們說道持久化帶關(guān)系的實體內(nèi)容時,了解到通過設(shè)置實體關(guān)系級聯(lián)屬性cascade可以調(diào)用persist方法自動持久化實體關(guān)系,一樣對更新實體鎖對應(yīng)關(guān)系,也是使用的。 merge方法同時更新實體對應(yīng)的關(guān)系實體
此時客戶端可以通過首先查找客戶實體,通過get或set方式對地址實體進(jìn)行修改,便可實現(xiàn)客戶地址的修正。
當(dāng)調(diào)用merge方法,實體管理器不但檢查客戶實體是不是修改i啊,也檢查鎖關(guān)聯(lián)的地址實體,若為瞬時態(tài),自動持久化,然后保存,若為托管,則更新到數(shù)據(jù)中。例如:新創(chuàng)建1個地址實體,也是可以持久化的
方法操作的背后還是要看現(xiàn)象的,不然理解起來不知所然呀
1個實體從創(chuàng)建到燒毀經(jīng)歷了多個狀態(tài),EntityManager是如果管理這些實體的,現(xiàn)在我們就揭開這個面紗吧
通常有這樣幾個狀態(tài) 瞬時態(tài)(transient),托管(managed)和燒毀(Removed),與Hibernate大相徑庭
舉例說明:
瞬時態(tài):對象未保存數(shù)據(jù)庫中,通過NEW對象,在內(nèi)存中,為持久化
持久態(tài):相對瞬時態(tài),調(diào)用persist,保存在數(shù)據(jù)庫中
托管態(tài)(Managed):是由上下文(persistence Contexgts)管理,是實體處于上下文可被管理的范圍內(nèi)。
游離太:相對托管態(tài),實體不在上下文中時,處于游離態(tài),
游離太情況:
燒毀態(tài)
實體從數(shù)據(jù)庫中刪除后,處于燒毀狀態(tài),但必須是在托管狀態(tài)下刪除,否則拋出異常
或許你會認(rèn)為,當(dāng)調(diào)用persist,merge或mremove方法時,就已將實體保存到數(shù)據(jù)庫中,但事實其實不是這樣的,這些方法知識改變了實體所處的狀態(tài),終究保存到數(shù)據(jù)庫中,使用的是flush方法
什么時候使用該方法什么時候呢,這需要了解flush提交的方式,默許是
AUTO自動調(diào)教,實體管理器根據(jù)事務(wù)結(jié)束后,會調(diào)用flush方法,
設(shè)置模式是
認(rèn)識了實體管理器的級聯(lián)操作和生命周期管理后,對期有了基本的概念,同時對1些關(guān)系的設(shè)置也有了感官,整體上有了1個提升,JPA EntityManager高級