<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Sealyu

    --- 博客已遷移至: http://www.sealyu.com/blog

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      618 隨筆 :: 87 文章 :: 225 評論 :: 0 Trackbacks
    原帖地址:http://blog.csdn.net/bq_cui/archive/2007/03/21/1536706.aspx

    開始學習seam的時候,有兩個問題:我會用Spring和Hibernate,但一點也不懂Seam 和EJB3的 EntityManager。我用了一些時間學習seam,但EntityManager 一直困擾我。
        同時我也有了一些小收獲,愿意跟剛剛開始學習seam的朋友分享以下。別緊張,我不敢確信我寫的東西都正確 ;).
        好了,關于EntityManager有何用處?它管理你的entities ;)。 那是一些簡單的java對象,通過getters and setters具備一些屬性。這些屬性之一是id(一般是Long數據類型),并且這些class必須以@Entity注解(annotated )。在seam的源碼中可以找到一大批這樣的例子,例如booking例子。在seam中,一件很重要的事情就是,每個Entity都有一個 @Name 注解(annotation),這樣,它們才能被注入到其他seam部件(component)中。
        假設我們有這樣一個entity class,叫做"Entity"。其生命周期內包含以下功能:

    EntityManager 提供了這些功能。首先,如何把EntityManager 引入我的代碼?很簡單:

    @PersistenceContext
    private EntityManager em;    

        好了,我們看看一個Entity 進程如何產生:

    Entity entity = new Entity();    

        這很簡單。現在,這entity 的狀態是NEW/TRANSIENT 。這意味著一個entity已經存在于你的應用程序中,但并不具有id,也不存在于你的數據庫中。

        由于我們要使它持久化(即它應被寫入數據庫),我們應把它的狀態轉換為MANAGED

    em.persist(entity);    

        現在,此entity由EntityManager管理了。EntityManager控制entity寫入數據庫。這動作無須立刻發生,可能把你的entity放在cache,稍后寫入數據庫。你可以放心,寫動作肯定會發生。

    Ok, what about reading an existing entity from the database? Therefore we use:

    好,如何從數據庫中讀出已存在的entity呢?這樣:

    Entity entity = em.find(Entity.class, Id);    

        每個entity 有一個id(我已經說過,多數情況下是Long數據類型),通過id你可存取entity。這是這里的第二個參數。第一個參數代表你要存取的Entity class的進程。find操作之后,entity的狀態也是MANAGED 。

    一旦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

    posted on 2009-04-13 15:34 seal 閱讀(2016) 評論(0)  編輯  收藏 所屬分類: Seam
    主站蜘蛛池模板: 亚洲毛片免费观看| 亚洲AV本道一区二区三区四区| 亚洲国色天香视频| 国产成人免费视频| 亚洲AV区无码字幕中文色 | 免费在线观看黄网站| 亚洲成AV人影片在线观看| 在线观看免费精品国产| 美女啪啪网站又黄又免费| 亚洲综合久久夜AV | 亚洲免费人成在线视频观看| 亚洲人成电影在线天堂| 13一14周岁毛片免费| 亚洲AV成人噜噜无码网站| 女人与禽交视频免费看| 男女猛烈xx00免费视频试看| 亚洲精品456播放| 男人都懂www深夜免费网站| 亚洲精品影院久久久久久| 成人毛片视频免费网站观看| 国产亚洲视频在线观看网址| a级亚洲片精品久久久久久久| 国产精品视频白浆免费视频| 亚洲一级免费毛片| 又大又粗又爽a级毛片免费看| 中文字幕免费在线观看动作大片| 久久丫精品国产亚洲av不卡 | 亚洲乱色伦图片区小说| 免费播放春色aⅴ视频| 麻豆精品不卡国产免费看| 亚洲乱码在线卡一卡二卡新区 | 久久亚洲国产欧洲精品一| 国产电影午夜成年免费视频| 亚洲GV天堂无码男同在线观看| 精品亚洲一区二区三区在线观看| 亚洲免费视频网站| 亚洲Av永久无码精品一区二区| 国产亚洲婷婷香蕉久久精品| 一二三四在线观看免费高清中文在线观看| 黄页网站在线免费观看| 亚洲经典在线中文字幕|