一旦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
)的「容器」中。「事務範圍」意味什麼?首先,什麼是「事務」?
ejb3
stateful 和 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翻譯自:
新手必讀二
二 限制選擇行 1.按指定的規則排序 select expr from table order by asc desc 預設的排序是asc公升序 由小到大 還可以order by 欄位名的位置 1 2 asc desc 當欄位名很複雜或者是算術表示式時用欄位名顯示的位置排序很方便.2.用where限...
新手必讀 ubuntu分割槽經驗
對於新新手在實機上安裝系統來說,難的不是怎麼是安裝乙個陌生的系統,而是不知道怎麼對硬碟進行分割槽,哪一種分割槽更新合理,網上也有人非常建議菜鳥先用虛擬機器嘗試,但現在有的vmware workstation等虛擬為了方便大家只提供了虛擬系統功能,並不能讓初始學者從硬碟劃分一步步進行系統的安裝。以下個...
SEO唯有勤奮優化,新手必讀!
剛剛接觸這個領域的新手,不淡定!不淡定只是概括的總結,具體點說就是心態不好,懶得動手,小聰明多等等一些列,堅持幾天頂多一兩周看不到效果就急了,沒有合理的計畫,或許今天幹那個,明天幹這個,毫無格局可言 懶得寫文章,懶得發外鏈 看不到效果或者剛接觸兩三天就找捷徑,耍小聰明,反倒被自己折騰的什麼效果都沒有...