目標:掌握實體管理器和實體管理器工廠的使用。主要內容:u javax.persistence.Persistence類u javax.persistence.EntityManagerFactory介面u javax.persistence.EntityManager介面u EntityManagerFactory對象的擷取u EntityManager對象的擷取u 用法1、javax.persistence.Persistence類該類用於擷取EntityManagerFactory,主要有兩個方法:u createEntityManagerFactory(String persistenceUnitName),建立並返回參數所指定的持久單元名字所對應的EntityManagerFactory。u createEntityManagerFactory(String persistenceUnitName,Map properties),建立並返回EntityManagerFactory,第一個參數是持久單元的名字,第二個參數是建立EntityManagerFactory所需要的屬性,這些屬性會覆蓋其他地方設定的屬性。兩個方法均為靜態方法,直接通過類名訪問即可。2、實體管理器工廠EntityManagerFactory實體管理器工廠用於管理實體管理器,是EntityManagerFactroy的對象。主要方法如下:u createEntityManager(),建立實體管理器u createEntityManager(Map map),根據指定的屬性建立實體管理器u close(),關閉實體管理器工廠,釋放資源u isOpen(),判斷實體管理器工廠是否關閉介面的詳細定義參加教材356頁。3、實體管理器EntityManager對實體的操作由實體管理器完成。主要方法如下(介面詳細定義參考書上357頁):u persist(Object o),持久化實體u merge(T o),合并實體狀態u remove(Object entity),刪除實體u find(Class entityClass,Object primarykey),根據主鍵尋找實體u flush(),同步到資料庫u setFlushMode(FlushModeType flushMode),設定同步方式u getFlushMode(),得到同步方式u lock(Object entity,LockModeType lockMode),鎖定u refresh(Object entity),更新狀態u clear(),清除持久上下文u contains(Object entity),判斷實體是否屬於當前上下文環境u createQuery(String sqlString),建立查詢u createNamedQuery(String name),建立命名查詢u createNativeQuery(String sqlString),建立標準SQL查詢u createNativeQuery(String sqlString,Class resultClass),建立標準SQL查詢,並指定查詢的結果u createNativeQuery(String sqlString,String resultsetMapping),建立標準SQL查詢,並指定查詢的結果如何映射u getTransaction(),返回事務對象4、實體管理器工廠的擷取實體管理工廠可以注入,也可以通過Persistence類擷取。4.1 通過注入擷取實體管理器工廠實體管理器工廠可以使用元注釋注入,可以使用下面的元注釋:javax.persistence.PersistenceUnit 表示一個對EntityManagerFactory的依賴。屬性如下:u 屬性name:在環境引用上下文中(in the environment referencing context,)訪問EntityManagerFactory所使用的名字,如果使用依賴注入,就不需要了。預設值是Null 字元串。u 屬性unitName:在persistence.xml中定義的持久單元的名字。如果要指定,JNDI中使用的實體管理器工廠的持久單元應該和該名字相同。例如:@PersistenceUnitEntityManagerFactory emf;4.2 通過Persistence類擷取 EntityManagerFactory emf = Persistence.createEntityManagerFactory(“OrderEM”);5、實體管理器的擷取實體管理器的擷取可以通過3種方式:u 注入實體管理器;u 尋找實體管理器;u 使用實體管理器工廠建立實體管理器。下面分別介紹。5.1 注入實體管理器在應用中可以注入實體管理器,注入實體管理器可以使用下面的元注釋:javax.persistence.PersistenceContext 表示一個對EntityManager持久內容相關的依賴。該元注釋中的屬性如下:u 屬性name:在環境引用上下文中(in the environment referencing context,)訪問實體管理器所使用的名字,如果使用依賴注入,就不需要了。預設值是Null 字元串。u 屬性unitName:持久單元的名字,如果指定了unitName元素,必須與在JNDI中能夠訪問的實體管理器的持久單元的名字相同。預設值是Null 字元串。u 屬性type指定事務類型:事務類型包括EXTEDNED(擴充持久上下文)和TRANSACTION(和事務範圍的持久上下文)。n PersistenceContextType.EXTENDEDn 或者PersistenceContextType.TRANSACTION。u 屬性properties:為容器或者持久提供者指定屬性。與特定持久性提供廠商相關的屬性也可以包含在這組屬性中。供應商不識別的屬性將被忽略。預設值是{}。例如:@PersistenceContextEntityManager em; 如果在當前應用中有多個持久單元,需要指出持久單元的名字。5.2 尋找實體管理器通過簡單尋找尋找實體管理器:聲明:@PersistenceContext(name=”orderEM”)注入SessionContext:@Resource SessionContext ctx;尋找:EntityManager em = (EntityManager)ctx.lookup(“orderEM”);5.3 通過實體管理器工廠建立實體管理器實體管理器工廠是EntityManagerFactory的對象,假設實體管理器工廠的對象是emf,建立實體管理器的代碼如下:EntityManager em = emf.createEntityManager();6、用法如果在Java SE環境下,需要通過javax.persistence.Persistence建立EntityManagerFactory對象,然後通過EntityManagerFactory對象建立EntityManager對象,然後使用EntityManager對象。如果在Java EE環境下,除了可以使用上面的方法外,還可以注入EntityManager對象和EntityManagerFactory對象。如果是注入EntityManagerFactory,然後建立EntityManager對象。教材:《Java EE 5實用教程——基於WebLogic和Eclipse》