生活随笔
收集整理的這篇文章主要介紹了
Java持久性API(JPA)第7讲——实体生命周期及生命周期回调方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
源貼地址:http://blog.csdn.net/javaeeteacher/archive/2007/06/25/1665345.aspx
目標與主要內容: u??????? 掌握實體的生命周期; u??????? 掌握實體的生命周期的轉換; u??????? 掌握實體的生命周期回調方法的使用; 1、?? 實體的生命周期 參考書上362頁。 4種狀態: u??????? 新建:沒有持久標識,并且沒有與上下文環境關聯。 u??????? 分離的:具有持久標識,并且沒有與持久上下文環境關聯。 u??????? 管理的:具有持久標識,并且與持久上下文環境關聯。 u??????? 刪除的:具有持久標識,并且與持久上下文環境關聯,但是準備從數據庫中刪除。 2、?? 對實體的操作 對實體的各種操作可以改變實體的狀態,對這些操作分別介紹如下: 2.1 持久化實體實例 通過persist方法或者被級聯persist方法完成。例如可以直接持久化一個訂單項,也可以通過持久化訂單,該操作可以級聯到訂單項。 persist操作結果如下: u??????? 如果是新的實體,則會變成管理的; u??????? 如果是被管理實體,則該操作被忽略; u??????? 如果是刪除的實體,則將重新變成被管理的; u??????? 如果是分離的實體,會拋出異常; u??????? 如果關系中聲明的級聯操作包括CascadeType.PERSIST,則會把級聯的實體持久化。 2.2 刪除實體 通過remove方法或者被級聯的remove方法完成。例如可以直接刪除一個訂單項,也可以通過刪除訂單來刪除訂單項。 Remove操作的結果如下: u??????? 如果是新的實體,則該操作被忽略; u??????? 如果是被管理實體,則會變成刪除的; u??????? 如果是刪除的實體,則該操作被忽略; u??????? 如果是分離的實體,會拋出異常; u??????? 事務提交的時候或者作為flush操作的結果,刪除的實體將從數據庫中刪除。 2.3 同步到數據庫 通常自動完成,也可以使用flush操作完成。 flush操作的結果如下: u??????? 如果實體是管理的實體,將被同步到數據庫; u??????? 如果是實體是刪除的實體,將從數據庫中刪除掉。 2.4 分離實體 分離的實體可能來自: u??????? 事務提交; u??????? 事務回滾; u??????? 刪除持久上下文; u??????? 管理實體管理器; u??????? 串行化一個實體或者通過值傳遞參數; 在第6講中,在Servlet中創建的Ordertable對象作為參數傳遞到會話Bean中的時候,就是這種狀態,所以需要先通過merge操作轉換成管理的狀態,然后再持久化。 2.5 合并分離的實體狀態 merge操作可以完成合并操作。合并操作的語法如下: u??????? 如果是新的實體,則會創建一個新的管理的實體; u??????? 如果是被管理實體,則該操作被忽略; u??????? 如果是刪除的實體,則產生異常; u??????? 如果是分離的實體,會創建一個新的管理的實體; 2.6 管理的實體實例 ??? 可以通過contains方法來判斷實體實例是否被管理。 3、?? 實體生命周期回調方法 生命周期方法可以定義在 u??????? 實體類; u??????? 超類; u??????? 實體類所關聯的實體監聽器類; u??????? 超類所關聯的實體監聽器類; 實體監聽器類必須有一個無參數的構造方法。 可以通過元注釋指定,也可以通過XML配置文件指定。 3.1 生命周期回調方法的定義 定義在實體類或者超類的回調方法: void <METHOD>() 定義在實體監聽器類的回調方法: Void <METHOD>(Object o) 回調方法可以是任何訪問控制類型,但是不能使用static和final修飾。 3.2 生命周期回調方法使用的元注釋 使用的元注釋及含義如下: u??????? PrePersist,持久化之前產生該事件 u??????? PostPersist,持久化之候產生該事件 u??????? PreRemove,刪除之前產生該事件 u??????? PostRemove,刪除之后產生該事件 u??????? PreUpdate,更新之前產生該事件 u??????? PostUpdate,更新之后產生該事件 u??????? PostLoad,加載之后產生該事件 3.3 實例 在第6講的Ordertable實體類中增加如下7個生命周期回調方法: ??? @PostLoad ??? public void postLoad(){ ??????? System.out.println("PreLoad生命周期方法被調用!"); ??? } ??? @PreRemove ??? public void preRemove(){ ??????? System.out.println("PreRemove生命周期方法被調用!"); ??? } ??? @PrePersist ??? public void prePersist(){ ??????? System.out.println("PrePersist生命周期方法被調用!"); ??? } ??? @PreUpdate ??? public void preUpdate(){ ??????? System.out.println("PreUpdate生命周期方法被調用!"); ??? } ??? @PostPersist ??? public void postPersist(){ ??????? System.out.println("PostPersist生命周期方法被調用!"); ??? } ??? @PostRemove ??? public void postRemove(){ ??????? System.out.println("PostRemove生命周期方法被調用!"); ??? } ??? @PostUpdate ??? public void postUpdate(){ ???????? System.out.println("PostUpdate生命周期方法被調用!");?????? ??? } ??? @Remove ??? public void remove(){ ???????? System.out.println("remove方法被調用!");????????? ??? } 如果要持久化一個訂單,會得到如下的輸出結果: PrePersist生命周期方法被調用! PostPersist生命周期方法被調用!
如果要調用下面的代碼: ??????? Ordertable order = em.find(Ordertable.class,orderid); ??????? Orderdetail item = new Orderdetail(orderid,goodsid); ??????? em.persist(item); ??????? item.setQuantity(quantity); ??????? if(order.getOrderdetailCollection()==null) ??????????? order.setOrderdetailCllection(new Vector<Orderdetail>()); ??????? order.getOrderdetailCollection().add(item); ??????? item.setOrdertable(order); 會得到如下的輸出結果: PreLoad生命周期方法被調用! PreLoad生命周期方法被調用! PreUpdate生命周期方法被調用! PostUpdate生命周期方法被調用!
從運行結果看調用了兩次PreLoad方法,這與持久性提供者有關。 如果執行下面的代碼: ??????? Ordertable order = em.find(Ordertable.class,orderid); ??????? em.remove(order);?? 會得到如下的輸出結果: PreLoad生命周期方法被調用! PreLoad生命周期方法被調用! PreRemove生命周期方法被調用! PostRemove生命周期方法被調用!
因為要先查找到實體才能刪除,所以調用了PreLoad方法。 刪除也可以使用下面的方法: em.createQuery("delete from Ordertable o where o.orderid = ?1").setParameter(1,orderid).executeUpdate();
3.4 一個生命周期事件的多個回調方法 同一個生命周期事件可以定義多個回調方法,可以在實體類、實體類的超類或者監聽類上,如果定義了同一個生命周期事件的多個回調方法,則調用這些方法的順序為: 如果有默認的監聽器類,先調用默認的監聽器類; 如果有實體監聽器類,則先調用父層次的實體監聽器類,后調用子層次的實體監聽器類,如果在同一個實體類上定義了多個實體監聽器類,按照定義的順序執行; 如果父層次定義了生命周期回調方法,調用父層次的生命周期回調方法; 調用子層次的生命周期回調方法。 詳細實例參考書上367頁。
轉載于:https://www.cnblogs.com/beta2013/archive/2008/12/29/3377372.html
總結
以上是生活随笔為你收集整理的Java持久性API(JPA)第7讲——实体生命周期及生命周期回调方法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。