資源描述:
《使用JPA完成實體的增刪改查》由會員上傳分享,免費在線閱讀,更多相關內容在教育資源-天天文庫。
1、第27章使用JPA完成實體的增刪改查教材:JavaEE實用教程主要內容27.1實體的狀態(tài)及操作27.2獲取EntityManagerFactory27.3獲取實體管理器27.4如何使用實體管理器27.5處理事務27.6在Web中使用JPA27.1實體的狀態(tài)及操作27.1.1持久化實體實例通過調用實體管理器的persist方法可以使一個實體實例變成管理的和持久的。如果X是一個新的實體,會變成被管理的。在事務提交之前,X會被寫到數(shù)據(jù)庫中。如果X是一個已經存在的被管理的實體,持久操作將被忽略。但是如果X與它的關聯(lián)實體之間的關系使用cascade=PERSIST或者c
2、ascade=ALL標注,意味著持久操作將影響所關聯(lián)的實體,會持久化關聯(lián)的實體。例如訂單包含多個訂單項,在持久化訂單的時候,會持久化訂單所涉及的訂單項。如果X是一個刪除的實體,它將變成被管理的。如果X是一個分離的對象,當調用persist操作的時候,將拋出EntityExistsException?;蛘咴谡{用flush或者commit方法的時候產生類似的異常。對于所有實體X關聯(lián)的實體Y,如果與Y的關聯(lián)關系使用cascade=PERSIST或者cascade=ALL進行標注,持久操作將用于Y。例如在持久化訂單的時候,與訂單關聯(lián)的訂單項都會被持久化。27.1.2刪
3、除實體通過調用實體管理器的remove方法或者級聯(lián)的刪除操作,一個被管理的實體實例可以變成被刪除的。如果X是一個新建的實體,remove操作將被忽略。但是刪除操作會被級聯(lián)到關聯(lián)的實體,如果關聯(lián)關系標注為cascade=REMOVE或者cascade=ALL。如果X是一個被管理的實體實例,刪除操作使得這個實體實例變成被刪除狀態(tài)。刪除操作會被級聯(lián)到關聯(lián)的實體,如果關聯(lián)關系標注為cascade=REMOVE或者cascade=ALL。如果X是一個分離的實體,調用remove操作的時候,將拋出異常IllegalArgumentException。如果X是一個刪除的實體
4、,remove操作將被忽略。在事務被提交的時候或者之前,或者作為flush操作的結果,被刪除的實體X將被從數(shù)據(jù)庫中刪除。實體被刪除之后,它的狀態(tài)就是刪除操作被調用的時候的狀態(tài)。27.1.3同步到數(shù)據(jù)庫在事務提交的時候,實體的狀態(tài)被更新到數(shù)據(jù)庫中。同步操作會把對持久實體的更新以及對它們的關系更新寫到數(shù)據(jù)庫中。27.1.4分離實體一個分離的實體可能來自:事務提交;事務回滾;刪除持久上下文;關閉實體管理器;串行化一個實體或者通過值傳遞實體。分離的實體實例繼續(xù)在持久上下文環(huán)境之外存在,它們的狀態(tài)不再被保證與數(shù)據(jù)庫中狀態(tài)一致。27.1.5合并分離的實體狀態(tài)把分離的實例的
5、狀態(tài)傳遞給實體管理器管理的持久實體。27.1.6管理的實體實例應用需要保證一個實例只在一個持久上下文中被管理。contains方法可以用于確定一個實體實例是否被當前持久化上下文管理。contains方法返回true的情況是:實體已經被從數(shù)據(jù)庫中檢索到,并且還沒有被刪除和分離實體實例是新建的,已經使用persiste方法,或者已經被級聯(lián)到persist操作。contains方法返回false的情況是:實例是分離的。對實體調用了remove方法,或者已經被級聯(lián)了remove方法。如果實例是新建的,還沒有被調用persist方法或者沒有級聯(lián)的persist。27.2
6、獲取EntityManagerFactory應用通過EntityManagerFactory接口來獲取實體管理器。通常EntityManagerFactory與persistence.xml中的persistenceUnit對應。實體管理工廠可以注入,也可以通過Persistence類獲取。27.2.1通過注入獲取實體管理器工廠使用javax.persistence.PersistenceUnit元注釋:name:在環(huán)境引用上下文中訪問EntityManagerFactory所使用的名字,如果使用依賴注入,就不需要了。默認值是空字符串。unitName:在pe
7、rsistence.xml中定義的持久單元的名字。例如:@PersistenceUnitEntityManagerFactoryemf;27.2.2通過Persistence類獲取通過調用javax.persistence.Persistence類的createEntityManagerFactory方法來創(chuàng)建實體管理器工廠。參數(shù)是持久單元的名字。EntityManagerFactoryemf=Persistence.createEntityManagerFactory("OrderEM");27.3獲取實體管理器EntityManager接口定義了與持久上下
8、文環(huán)境進行交互的方法。包括創(chuàng)建實體、刪