EntityManager:seam新手必读(二)
生活随笔
收集整理的這篇文章主要介紹了
EntityManager:seam新手必读(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??? 一旦entity數據有所改變,將反映到數據庫中。不能確認EntityManager何時會向數據庫寫入更新的數據。但是這一事件肯定會發生,一般是馬上,但不會晚于EntityManager消失;)。你可以控制觸發更新數據庫:
em.flush();????
???? 這將強制EntityManager 立刻將更新寫入數據庫。請記住,這條語句將影響所有狀態為MANAGED的entitie,而不是當前一個。不過,一般情況下不必這么做。
??? 如果你想反其道而行之,也就是從數據庫載入一個entity (因為別人可能已經修改其數據),這么寫:
em.refresh(entity);????
??? 怎樣刪除一個entity呢?很簡單:
em.remove(entity);????
??? 現在,entity的狀態成為REMOVED,表示其已經被列入刪除計劃。你可以用flush()語句,讓刪除動作馬上發生,但沒必要這么干。
??? 現在來點復雜的。當注入EntityManager 的時候,有一個事務范圍持久上下文( Transaction Scoped Persistence Context)。當entitie處在MANAGED狀態時,其處在持久上下文(persistence context )的“容器”中。“事務范圍”意味什么?首先,什么是“事務”?
??? EJB3Stateful 和 Stateless beans (依同名標注辨別)的每個方法調用都包裝到一個事務內。(順便說一下,事務一旦發生RuntimeException,即發生會滾,對數據的改變將撤銷)。因此,持久上下文(persistence context)將在調用方式之前建立,方式調用結束后移除。然后,持久上下文中管理的所有entity的狀態成為 DETACHED。
??? 假設在你的bean里頭有兩個method。第一個是load(), 它調用find函數取出數據庫中的一個實體。第二個是finish(),返回一個JSF輸出。調用這兩個函數中間修改了實體數據。這種修改持久到數據庫中嗎?回答是:NO。
??? load() 函數結束后,EntityManager'的持久上下文結束,它所有管理過的entity狀態成為DETACHED。一個后果是,與新entity相反-有一個ID,但他們的狀態并不是managed ,對這些detached entities 所作的更新并不影響數據庫。如果你想使一個entity 更新數據庫,需要將其重新attach到持久上下文。在這個例子中,在finish()方法中增加以下行:
em.merge(entity);????
??? 現在這個entity 已經合并到finish()方法的持久上下文中(記住,每個方法是一個事務,每個事物有自己的持久上下文),并且狀態是又變為managed。
???? 這樣做是可以的,但有兩個缺點:
-需要調用merge(->多了一些代碼)
-調用find()之前,如果某個entity未初始化,而你又要存取它的某些屬性,將會得到exception 錯誤。
??? 有一個簡單的解決方案:擴展持久上下文的生命期,這樣,當調用多個事務/方法時,entity狀態始終保持為managed 。因此,我們改變EntityManager的注入方式:
@PersistenceContext(type=PersistenceContextType.EXTENDED
private?EntityManager?em;???
???? 現在,managed entities "生活在"一個擴展持久上下文中( Extended Persistence Context )。
??? 你甚至無須呼叫merge()方法,因為eitities從未被DETACHED。你可能會問:普通事務范圍( "normal" (transaction scoped) )持久上下文的好處是什么?它一直依附于你做的事情(小崔:什么意思?)。擴展上下文需要更多的內存,因為即使你不需要,它也一直存在于內存。并且一旦entities被其他的bean改變(它們有自己的持久上下文),你需要顯式地調用refresh()方法(在overviews/list頁面)。當你需要普通EntityManager 時它就在那里,因其生命周期短,只能操作即時數據;)
???
??? 當談及列表:為取得不止一個實體,而是一個實體集合,使用:
List<Entity>?entities?=?em.createQuery("from?Entity").getResultList();????
??? 這不是“真正”SQL,而是類似sql的東西,稱之為EJBQL。你可以用它執行某些條件查詢,排序等,如
..."from?Entity?where?lastName=".nameToSearchFor."?order?by?firstName"????
??? 僅使用entity屬性名稱即可。關于EJBQL 要說的太多了,但對于本篇介紹來說這已足夠。
??? 好,基本介紹到此為止。希望對你來說,在如何使用EntityManager方面,這一個簡單易懂的介紹。
??? 我已聲明過,不能保證百分百正確。并且肯定有許多英語語法錯誤(對不起,我是德國人,不要打我PP噢)。歡迎斧正。
2007.4.11翻譯自:
http://www.jboss.com/index.html?module=bb&op=viewtopic&t=88460
em.flush();????
???? 這將強制EntityManager 立刻將更新寫入數據庫。請記住,這條語句將影響所有狀態為MANAGED的entitie,而不是當前一個。不過,一般情況下不必這么做。
??? 如果你想反其道而行之,也就是從數據庫載入一個entity (因為別人可能已經修改其數據),這么寫:
em.refresh(entity);????
??? 怎樣刪除一個entity呢?很簡單:
em.remove(entity);????
??? 現在,entity的狀態成為REMOVED,表示其已經被列入刪除計劃。你可以用flush()語句,讓刪除動作馬上發生,但沒必要這么干。
??? 現在來點復雜的。當注入EntityManager 的時候,有一個事務范圍持久上下文( Transaction Scoped Persistence Context)。當entitie處在MANAGED狀態時,其處在持久上下文(persistence context )的“容器”中。“事務范圍”意味什么?首先,什么是“事務”?
??? EJB3Stateful 和 Stateless beans (依同名標注辨別)的每個方法調用都包裝到一個事務內。(順便說一下,事務一旦發生RuntimeException,即發生會滾,對數據的改變將撤銷)。因此,持久上下文(persistence context)將在調用方式之前建立,方式調用結束后移除。然后,持久上下文中管理的所有entity的狀態成為 DETACHED。
??? 假設在你的bean里頭有兩個method。第一個是load(), 它調用find函數取出數據庫中的一個實體。第二個是finish(),返回一個JSF輸出。調用這兩個函數中間修改了實體數據。這種修改持久到數據庫中嗎?回答是:NO。
??? load() 函數結束后,EntityManager'的持久上下文結束,它所有管理過的entity狀態成為DETACHED。一個后果是,與新entity相反-有一個ID,但他們的狀態并不是managed ,對這些detached entities 所作的更新并不影響數據庫。如果你想使一個entity 更新數據庫,需要將其重新attach到持久上下文。在這個例子中,在finish()方法中增加以下行:
em.merge(entity);????
??? 現在這個entity 已經合并到finish()方法的持久上下文中(記住,每個方法是一個事務,每個事物有自己的持久上下文),并且狀態是又變為managed。
???? 這樣做是可以的,但有兩個缺點:
-需要調用merge(->多了一些代碼)
-調用find()之前,如果某個entity未初始化,而你又要存取它的某些屬性,將會得到exception 錯誤。
??? 有一個簡單的解決方案:擴展持久上下文的生命期,這樣,當調用多個事務/方法時,entity狀態始終保持為managed 。因此,我們改變EntityManager的注入方式:
@PersistenceContext(type=PersistenceContextType.EXTENDED
private?EntityManager?em;???
???? 現在,managed entities "生活在"一個擴展持久上下文中( Extended Persistence Context )。
??? 你甚至無須呼叫merge()方法,因為eitities從未被DETACHED。你可能會問:普通事務范圍( "normal" (transaction scoped) )持久上下文的好處是什么?它一直依附于你做的事情(小崔:什么意思?)。擴展上下文需要更多的內存,因為即使你不需要,它也一直存在于內存。并且一旦entities被其他的bean改變(它們有自己的持久上下文),你需要顯式地調用refresh()方法(在overviews/list頁面)。當你需要普通EntityManager 時它就在那里,因其生命周期短,只能操作即時數據;)
???
??? 當談及列表:為取得不止一個實體,而是一個實體集合,使用:
List<Entity>?entities?=?em.createQuery("from?Entity").getResultList();????
??? 這不是“真正”SQL,而是類似sql的東西,稱之為EJBQL。你可以用它執行某些條件查詢,排序等,如
..."from?Entity?where?lastName=".nameToSearchFor."?order?by?firstName"????
??? 僅使用entity屬性名稱即可。關于EJBQL 要說的太多了,但對于本篇介紹來說這已足夠。
??? 好,基本介紹到此為止。希望對你來說,在如何使用EntityManager方面,這一個簡單易懂的介紹。
??? 我已聲明過,不能保證百分百正確。并且肯定有許多英語語法錯誤(對不起,我是德國人,不要打我PP噢)。歡迎斧正。
2007.4.11翻譯自:
http://www.jboss.com/index.html?module=bb&op=viewtopic&t=88460
轉載于:https://www.cnblogs.com/cuibq/archive/2007/03/21/3802016.html
總結
以上是生活随笔為你收集整理的EntityManager:seam新手必读(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java与.NET 的Web Servi
- 下一篇: IE代理切换工具