ourday

          ourday

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            8 Posts :: 2 Stories :: 11 Comments :: 0 Trackbacks

          2010年5月9日 #

          JPA是什么

           

          定義 Java Persistence API

          JPA通過JDK 5.0注解或XML描述對象-關系表的映射關系,并將運行期的實體對象持久化到數據庫中。

          起源

          Sun引入新的JPA ORM規范出于兩個原因:其一,簡化現有Java EE和Java SE應用的對象持久化的開發工作;其二,Sun希望整合對ORM技術,實現天下歸一。

          JPA由EJB 3.0軟件專家組開發,作為JSR-220實現的一部分。但它不囿于EJB 3.0,你可以在Web應用、甚至桌面應用中使用。JPA的宗旨是為POJO提供持久化標準規范,由此可見,經過這幾年的實踐探索,能夠脫離容器獨立運 行,方便開發和測試的理念已經深入人心了。目前Hibernate 3.2、TopLink 10.1.3以及OpenJPA都提供了JPA的實現。

          JPA的總體思想和現有Hibernate、TopLink,JDO等ORM框架大體一致。總的來說,JPA包括以下3方面的技術:

          ORM映射元數據

          JPA支持XML和JDK 5.0注解兩種元數據的形式,元數據描述對象和表之間的映射關系,框架據此將實體對象持久化到數據庫表中;

          JPA 的API

          用來操作實體對象,執行CRUD操作,框架在后臺替我們完成所有的事情,開發者從繁瑣的JDBC和SQL代碼中解脫出來。

          查詢語言

          這是持久化操作中很重要的一個方面,通過面向對象而非面向數據庫的查詢語言查詢數據,避免程序的SQL語句緊密耦合。

          JPA的優勢

          1 標準化

          JPA 是 JCP 組織發布的 Java EE 標準之一,因此任何聲稱符合 JPA 標準的框架都遵循同樣的架構,提供相同的訪問 API,這保證了基于JPA開發的企業應用能夠經過少量的修改就能夠在不同的JPA框架下運行。

          2 對容器級特性的支持

          JPA 框架中支持大數據集、事務、并發等容器級事務,這使得 JPA 超越了簡單持久化框架的局限,在企業應用發揮更大的作用。

          3 簡單易用,集成方便

          JPA的主要目標之一就是提供更加簡單的編程模型:在JPA框架下創建實體和創建Java 類一樣簡單,沒有任何的約束和限制,只需要使用 javax.persistence.Entity進行注釋;JPA的框架和接口也都非常簡單,沒有太多特別的規則和設計模式的要求,開發者可以很容易的 掌握。JPA基于非侵入式原則設計,因此可以很容易的和其它框架或者容器集成。

          4 可媲美JDBC的查詢能力

          JPA的查詢語言是面向對象而非面向數據庫的,它以面向對象的自然語法構造查詢語句,可以看成 是Hibernate HQL的等價物。JPA定義了獨特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一種擴展,它是針對實體的一種查詢語言,操作對象是實體,而不是關系數據庫的表,而且能夠支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能夠提供的高級查詢特性,甚至還能夠支持子查詢。

          5 支持面向對象的高級特性

          JPA 中能夠支持面向對象的高級特性,如類之間的繼承、多態和類之間的復雜關系,這樣的支持能夠讓開發者最大限度的使用面向對象的模型設計企業應用,而不需要自行處理這些特性在關系數據庫的持久化。

          JPA的供應商

          JPA 的目標之一是制定一個可以由很多供應商實現的API,并且開發人員可以編碼來實現該API,而不是使用私有供應商特有的API。因此開發人員只需使用供應 商特有的API來獲得JPA規范沒有解決但應用程序中需要的功能。盡可能地使用JPA API,但是當需要供應商公開但是規范中沒有提供的功能時,則使用供應商特有的API。

          1 Hibernate

          JPA是需要Provider來實現其功能的,Hibernate就是JPA Provider中很強的一個,目前來說應該無人能出其右。從功能上來說,JPA現在就是Hibernate功能的一個子集。Hibernate 從3.2開始,就開始兼容JPA。Hibernate3.2獲得了Sun TCK的JPA(Java Persistence API) 兼容認證。

          只要熟悉Hibernate或者其他ORM框架,在使用JPA時會發現其實非常容易上手。例如 實體對象的狀態,在Hibernate有自由、持久、游離三種,JPA里有new,managed,detached,removed,明眼人一看就知 道,這些狀態都是一一對應的。再如flush方法,都是對應的,而其他的再如說Query query = manager.createQuery(sql),它在Hibernate里寫法上是session,而在JPA中變成了manager,所以從 Hibernate到JPA的代價應該是非常小的

          同樣,JDO,也開始兼容JPA。在ORM的領域中,看來JPA已經是王道,規范就是規范。在各大廠商的支持下,JPA的使用開始變得廣泛。

          2 Spring

          Spring + Hibernate 常常被稱為 Java Web 應用人氣最旺的框架組合。而在 JCP 通過的 Web Beans JSR ,卻欲將JSF + EJB + JPA 、來自 JBoss Seam(Spring 除外)的一些組件和EJB 3(目前能夠提供有基本攔截和依賴注入功能的簡化 Session Bean 框架)的一個 Web 組合進行標準化。如今的 Spring 2.0 為 JPA 提供了完整的 EJB 容器契約,允許 JPA在任何環境內可以在 Spring 管理的服務層使用(包括 Spring 的所有 AOP 和 DI 增強)。同時,關于下一個Web應用組合會是 EJB、Spring + Hibernate 還是 Spring + JPA 的論戰,早已充斥于耳。

          在Spring 2.0.1中,正式提供對JPA的支持,這也促成了JPA的發展,要知道JPA的好處在于可以分離于容器運行,變得更加的簡潔。

          3 OpenJPA

          OpenJPA 是 Apache 組織提供的開源項目,它實現了 EJB 3.0 中的 JPA 標準,為開發者提供功能強大、使用簡單的持久化數據管理框架。OpenJPA 封裝了和關系型數據庫交互的操作,讓開發者把注意力集中在編寫業務邏輯上。OpenJPA 可以作為獨立的持久層框架發揮作用,也可以輕松的與其它 Java EE 應用框架或者符合 EJB 3.0 標準的容器集成。

          4 其它

          目前支持的實現包括Toplink、Hibernate Entitymanager等。TopLink以前需要收費,如今開源了。OpenJPA雖然免費,但功能、性能、普及性等方面更加需要加大力度。

          對于EJB來說,實體Bean一直是被批評的對象,由于其太復雜和龐大。JPA的出現,很大程度的分離了復雜性。這讓EJB的推廣也變得容易。

          總而言之,JPA規范主要關注的僅是API的行為方面,而由各種實現完成大多數性能有關的調優。盡管如此,所有可靠的實現都應該擁有某種數據緩存,以作為選擇。但愿不久的將來,JPA能成為真正的標準。

          小結

          EJB 3.0和JPA 毫無疑問將是Java EE 5的主要賣點。在某些領域中,它們給Java社區帶來了競爭優勢,并使Java 在其他領域與競爭對手不分伯仲(因為,不可否認,目前某些領域尚不存在基于標準的方法)。

          過去數年來,Spring Framework一直是EJB在企業領域的主要競爭對手。EJB3.0規范解決了很多促進Spring興起的問題。隨著它的出現,EJB3.0毫無疑問比Spring提供了更好的開發體驗——最引人注目的優勢是它不需要配置文件。

          JPA提供一種標準的OR映射解決方案,該解決方案完全集成到EJB3。0兼容的容器中。JPA的前輩將會繼續穩定發展,但是業務應用程序中的 raw 使用將可能會減少。實現 JPA 兼容的實體管理器似乎很可能是此類技術的發展方向。

          Java EE系列規范的較大問題與JPA沒有任何關系。Java EE 系列規范的問題涉及到 Web和EJB容器之間的集成。Spring在此領域仍然具有主要競爭優勢。JBoss的Seam項目嘗試使用自定義的方法來解決這一問題。Caucho Resin應用服務器試圖擴展容器邊界并支持在Web容器中使用@EJB注釋。我們希望Java EE 5.1將解決層集成的問題,為我們提供一個全面而標準的依賴性注入方法。

          在不久的將來,Sun可能會將JPA作為一個單獨的JSR對待,同時JPA還可能作為Java SE的一部分。不過這些都不太重要,重要的是,我們現在已經可以在脫離容器的情況下、在Java SE應用中使用JPA了。

          JPA已經作為一項對象持久化的標準,不但可以獲得Java EE應用服務器的支持,還可以直接在Java SE中使用。開發者將無需在現有多種ORM框架中艱難地選擇,按照Sun的預想,現有ORM框架頭頂的光環將漸漸暗淡,不再具有以往的吸引力。

          值得注意的是Java Persistence API并不是J2EE環境

          專用,而是在java中的通用API。意味著我們可以在任何需要訪問關系數據庫的地方使用JPA,

          甚至包括面應用。JPA也不要求一定在J2EE容器中才能運行,而是任何有JVM的環境都可以運用。

          這就使得我們可以很容易的把JPA作為一個持久化組件自由的和各種容器/框架(EJB3容器, Spring等等)組合。

             JPA最主要的是一個統一的persistence.xml配置文件,可以放到每一個jar的META-INF/目錄下面,配置內容主要有

          (以hibernate為例)

          1、數據庫連接的配置文件

          2、數據庫方言、連接URL、用戶名、密碼

          3、ORM映射的列表(Class)

          4、配置其它的Hibernate屬性(其他的Provider屬性)

          5、cache

          主要內容,詳細內容請看hibernate的reference

          xml 代碼

          1. xml version="1.0" encoding="UTF-8"?>  
          2. <persistence>  
          3.    <persistence-unit name="TestEntityManager" transaction-type="RESOURCE_LOCAL">  
          4.       <provider>org.hibernate.ejb.HibernatePersistenceprovider>     
          5.       <class>com.jl.sub1.mapping.Productclass>  
          6.       <class>com.jl.sub1.mapping.ProductItemclass>  
          7.         
          8.       <properties>  
          9.           <property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialect" />  
          10.           <property name="hibernate.connection.driver_class" value="com.ibm.db2.jcc.DB2Driver" />  
          11.           <property name="hibernate.connection.password" value="db2admin" />  
          12.           <property name="hibernate.connection.url" value="jdbc:db2://10.1.1.10:50000/dbjl" />  
          13.           <property name="hibernate.connection.username" value="db2admin" />  
          14.           <property name="hibernate.ejb.autodetection" value="class" />  
          15.     properties>               
          16.    persistence-unit>  
          17. persistence>  
          18.   
          19.   
          20.   
          21.   
          22. <property name="kodo.ConnectionDriverName" value="..."/>  
          23. <property name="kodo.ConnectionURL" value="..."/>  
          24. <property name="kodo.ConnectionUserName" value="..."/>  
          25. <property name="kodo.ConnectionPassword" value="..."/>  
          26. <property name="kodo.Log" value="DefaultLevel=INFO, Runtime=DEBUG, Tool=INFO"/>  
          27.              

           

          spring配置

          xml 代碼

          1. <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">  
          2.     <property name="entityManagerName"         value="TestEntityManager" />     
          3.     <property name="jpaProperties">  
          4.         <props></props>  
          5.     </property>  
          6.       
          7. </bean>  
          8. <!-- 此處的名字要和persistence.xml中定義的name一致-->  
          9. <!-- jpaProperties此屬性必須要加,hibernate3.1.2的一個bug,否則會拋NullPointerException,springframework論壇告訴我的:)-->  
          10.   
          11. <bean class=  
          12.     "org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>  
          13.     <!--貌似這個部分所有spring配置文件還是僅允許一個,可以配置到公共的xml中-->  
          14.       
          15. <!--引用上面建立的entityManagerFactory-->  
          16. <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">  
          17.     <property name="entityManagerFactory“ ref="entityManagerFactory" />  
          18.           
          19. </bean>  
          20.   
          21. <bean id="transactionInterceptor"  
          22.     class="org.springframework.transaction.interceptor.TransactionInterceptor">  
          23.     <property name="transactionManager" ref="transactionManager" />  
          24.     <property name="transactionAttributeSource">  
          25.     <bean class=  
          26.     "org.springframework.transaction.annotation.AnnotationTransactionAttributeSource" />  
          27.     </property>  
          28. </bean>  
          29.   
          30. <bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">  
          31.     <property name="transactionInterceptor" ref="transactionInterceptor" />  
          32. </bean>  
          33.   
          34. <!--自定義DAO-->  
          35. <bean id="numberDao" class="dao.JpaNumberDAO">  
          36.     <property name="entityManagerFactory“ ref="entityManagerFactory" />  
          37. </bean>  
          38. <!--DAO需繼承自org.springframework.orm.jpa.support.JpaDaoSupport-->  
          39. <!--DAO中可以通過getJpaTemplate()的各種方法進行持久化操作-->  

           

          這樣就好了,可以使用entitymanager,每個jar里面可以相互不用影響,而且這個也符合我們新過程改進推進的每個子系統用jar發布的原則,當然這里的還有作service層,對于子系統之間的交互,我覺得,原則上應該僅允許他們在service的層面上進行,在DAO之間不應該有相互的交叉,不過隱約覺

          得還有很多東西要做,嗯,很晚了,肚子餓,明天再想,呵呵

          哦,對了,Spring真是好東西,封裝了這么多東西給我們用,真是期待更好的版本出來啊,

          還有,在j2se環境里,也可以通過代碼的方式取得JPA的api

          java 代碼

          1. EntityManagerFactory emf =  
          2. Peristence.createEntityManagerFactory(“TestEntityManager”) ;  
          3. //此處的名字要和persistence.xml中  
          4.   
          5. //定義的name一致  
          6.   
          7.   
          8. EntityManager em = emf.createEntityManager();  
          9. ...//使用  
          10. em.close();  
          11. ...  
          12. emf.close();  
          13. EntityManagerFactory emf =  
          14. Peristence.createEntityManagerFactory(“TestEntityManager”) ;  
          15. EntityManager em = emf.createEntityManager();  
          16. ...//使用  
          17. em.close();  
          18. ...  
          19. emf.close();  

          posted @ 2010-05-09 15:02 ourday 閱讀(1798) | 評論 (1)編輯 收藏

          使用注解元數據
          基本注解:
          例子:
          @Entity(name = "T_TOPIC") ①
          public class Topic implements Serializable ...{

          @Id ② -1

          @GeneratedValue(strategy = GenerationType.TABLE) ② -2

          @Column(name = "TOPIC_ID") ② -3

          private int topicId;

          @Column(name = "TOPIC_TITLE", length = 100) ③
          private String topicTitle;

          @Column(name = "TOPIC_TIME") @Temporal(TemporalType.DATE) ④
          private Date topicTime;

          @Column(name = "TOPIC_VIEWS")

          private int topicViews;

          ...

          }



          解釋:
          ① Entity 標明該類 (Topic) 為一個實體類,它對應數據庫中的表表名是 T_TOPIC ,這里也可以寫成: @Entity

          @Table(name = "T_TOPIC") 其作用都是一樣的
          ② -1 Id 標明該屬性對應數據表中的主鍵
          ② -2 GeneratedValue 通過 strategy 屬性指明主鍵生成策略,默認情況下, JPA 自動選擇一個最適合底層數據庫的主鍵生成策略。在 javax.persistence.GenerationType 中定義了以下幾種可供選擇的策略:
          1) IDENTITY :表自增鍵字段, Oracle 不支持這種方式;
          2) AUTO : JPA 自動選擇合適的策略,是默認選項;
          3) SEQUENCE :通過序列產生主鍵,通過 @SequenceGenerator 注解指定序列名, MySql 不支持這種方式;
          4) TABLE :通過表產生主鍵,框架借由表模擬序列產生主鍵,使用該策略可以使應用更易于數據庫移植。
          ② -3 Column 標明這個屬性是數據表中的一列,該列的名字是 TOPIC_ID

          ③ Column 的一個屬性 length 指明的是該屬性的允許的長度。 ( 個人認為設定該屬性只是對于程序中操作該屬性時增加了一驗證過程,對數據庫中該列原來的設置并沒有影響,但是 length 屬性指定的值必須不能大于數據庫創建表時給該列限制的最大長度否則會出錯 )

          ④ Temporal(TemporalType.DATE) :如果屬性是時間類型,因為數據表對時間類型有更嚴格的劃分,所以必須指定具體時間類型。在 javax.persistence.TemporalType 枚舉中定義了 3 種時間類型:
          1) DATE :等于 java.sql.Date

          2) TIME :等于 java.sql.Time

          3) TIMESTAMP :等于 java.sql.Timestamp



          繼承關系注解:
          對繼承關系進行注解,必須在 父類 中聲明繼承實體的映射策略。
          例子:
          @Entity(name = "T_TOPIC")

          @Inheritance(strategy = InheritanceType.SINGLE_TABLE) ① @DiscriminatorColumn(name = "TOPIC_TYPE", discriminatorType =

          DiscriminatorType.INTEGER, length = 1) ②
          @DiscriminatorValue(value="1") ③
          public class Topic implements Serializable ...{ … }



          解釋:
          ① Inheritance 通過 strategy 屬性指明實體的繼承策略。
          在 javax.persistence.InheritanceType 定義了 3 種映射策略:
          1) SINGLE_TABLE :父子類都保存到同一個表中,通過字段值進行區分。
          2) JOINED :父子類相同的部分保存在同一個表中,不同的部分分開存放,通過表連接獲取完整數據;
          3) TABLE_PER_CLASS :每一個類對應自己的表,一般不推薦采用這種方式。
          ② DiscriminatorColumn 如果繼承策略采用第一種繼承策略,則需要指明區分父子類的字段, DiscriminatorColumn 就是用來指明區分字段的注解。
          ③ DiscriminatorValue 同樣的采用第一種繼承策略通過字段區分父子類,則用這個注解給該實體的區分字段賦值在這里賦的值為 ”1”.



          關聯關系注解:
          例子:
          @Entity @DiscriminatorValue(value="2") ①
          public class PollTopic extends Topic ...{ ②繼承于 Topic 實體
          private boolean multiple; ③
          @Column(name = "MAX_CHOICES")

          private int maxChoices; @OneToMany(mappedBy="pollTopic",cascade=CascadeType.ALL) ④
          private Set options = new HashSet();

          // 省略 get/setter 方法
          }

          解釋 :

          ① 通過 @DiscriminatorValue 將區分字段 TOPIC_TYPE 的值為 2 。由于 PollTopic 實體繼承于 Topic 實體,其它的元數據信息直接從 Topic 獲得。
          ④ OneToMany 指定了一個一對多的關聯關系, mappedBy 屬性指定 “Many” 方類引用 “One” 方類 的屬性名; cascade 屬性指明了級聯方式(如果這里不指定為 CascadeType.ALL 的話,那么有關聯關系的兩個對象在做保存和刪除操作時要分別來進行) 建議 :盡可能使用 cascade=CascadeType.ALL 來減少持久化操作的復雜性和代碼量
          注意 : JPA 規范規定任何屬性都默認映射到表中,所以雖然我們沒有給③處的 multiple 屬性提供注解信息,但 JPA 將按照 默認的規則對該字段進行映射:字段名和屬性名相同,類型相同。如果我們不希望將某個屬性持久化到數據表中,則可以通過 @Transient 注解顯式指定:
          @Transient

          private boolean tempProp1;





          @Entity(name="T_POLL_OPTION")

          Public class PollOption implements Serializable ...{

          @Id

          @GeneratedValue(strategy = GenerationType.TABLE)

          @Column(name = "OPTION_ID")

          private int optionId;

          @Column(name = "OPTION_ITEM")

          private String optionItem;

          @ManyToOne ①
          @JoinColumn(name="TOPIC_ID", nullable=false) ②
          private PollTopic pollTopic;

          }



          解釋:
          ① ManyToOne 描述了多對一的關聯關系,他是對該類引用的 ”One” 類 (PollTopic) 的屬性( pollTopic )進行注解的。
          ② JoinColumn 指定關聯 ”One”(PollTopic) 實體所對應表的 “ 外鍵 ” 。


          Lob 字段的注解:
          在 JPA 中 Lob 類型類型的持久化很簡單,僅需要通過特殊的 Lob 注解就可以達到目的。
          例子:


          @Lob ① -1

          @Basic(fetch = FetchType.EAGER) ① -2

          @Column(name = "POST_TEXT", columnDefinition = "LONGTEXT NOT NULL") ① -3

          private String postText;



          @Lob

          @Basic(fetch = FetchType. LAZY) ② -2

          @Column(name = "POST_ATTACH", columnDefinition = "BLOB") ② -3

          private byte[] postAttach;



          解釋:
          ① -1 JPA 通過 @Lob 將屬性標注為 Lob 類型 ;
          ① -2 通過 @Basic 指定 Lob 類型數據的獲取策略, FetchType.EAGER 表示非延遲 加載,而 FetchType. LAZY 表示延遲加載 ;
          ① -3 通過 @Column 的 columnDefinition 屬性指定數據表對應的 Lob 字段類型。






          使用 XML 元數據


          除了使用注解提供元數據信息外, JPA 也允許我們通過 XML 提供元數據信息。按照 JPA 的規范, 如果你提供了 XML 元數據描述信息,它將覆蓋實體類中的注解元數據信息 。 XML 元數據信息以 orm.xml 命名,放置在類路徑的 META-INF 目錄下。


          <?xml version="1.0" encoding="UTF-8"?>

          <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"

          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

          xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"

          version="1.0">

          ①實體對象所在的包
          <package>com.baobaotao.domain</package>

          <entity class="Topic">

          ② Topic 實體配置

          <table name="T_TOPIC" />

          <attributes>

          <id name="topicId">

          <column name="TOPIC_ID"/>

          <generated-value strategy="TABLE" />

          </id>

          <basic name="topicTitle">

          <column name="TOPIC_TITLE" length="30" />

          </basic>

          <basic name="topicTime">

          <column name="TOPIC_TIME" />

          <temporal>DATE</temporal>

          </basic>

          <basic name="topicViews">

          <column name="TOPIC_VIEWS" />

          </basic>

          </attributes>

          </entity>

          <entity class="PollTopic">

          ② PollTopic 實體配置

          <discriminator-value>2</discriminator-value>

          <attributes>

          <basic name="maxChoices">

          <column name="MAX_CHOICES" />

          </basic>

          <one-to-many name="options" mapped-by="pollTopic">

          <cascade>

          <cascade-all/>

          </cascade>

          </one-to-many>

          </attributes>

          </entity>

          <entity class="PollOption">

          ② PollOption 實體配置

          <table name="T_POLL_OPTION" />

          <attributes>

          <id name="optionId">

          <column name="OPTION_ID" />

          <generated-value strategy="TABLE" />

          </id>

          <basic name="optionItem">

          <column name="OPTION_ITEM"/>

          </basic>

          <many-to-one name="pollTopic" >

          <join-column name="TOPIC_ID" nullable="false"/>

          </many-to-one>

          </attributes>

          </entity>

          <entity class="Post">

          ② Post 實體配置

          <table name="T_POST" />

          <attributes>

          <id name="postId">

          <column name="POST_ID" />

          <generated-value strategy="TABLE" />

          </id>

          <basic name="postText" fetch="EAGER">

          <column name="POST_TEXT" column-definition="LONGTEXT NOT NULL"/>

          <lob/>

          </basic>

          <basic name="postAttach" fetch="LAZY">

          <column name="POST_ATTACH" column-definition="BLOB"/>

          <lob/>

          </basic>

          </attributes>

          </entity>

          </entity-mappings>



          使用這個 orm.xml 來描述實體信息的話,這里并沒有標明兩個繼承類之間的關系,其繼承信息將從實體類反射信息獲取。


          到這里我們的實體描述結束了,當然我們只是做了比較簡單的描述,對于那些復雜的信息描述并沒有進行講述。實體描述結束了,有人會問如果我要來操作這些實體該怎么操作?這就是我們接下來要講述的問題。


          EntityManager 介紹

          實體對象由實體管理器進行管理, JPA 使用 javax.persistence.EntityManager 代表實體管理器。實體管理器和持久化上下文關聯,持久化上下文是一系列實體的管理環境,我們通過 EntityManager 和持久化上下文進
          posted @ 2010-05-09 14:57 ourday 閱讀(1347) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 大同县| 岳阳县| 巴青县| 陵水| 翁牛特旗| 连南| 中阳县| 仁布县| 临武县| 彩票| 隆昌县| 邢台县| 公主岭市| 益阳市| 邵阳市| 昌邑市| 濮阳县| 牙克石市| 东台市| 鄯善县| 杭锦旗| 金阳县| 鞍山市| 南和县| 浦县| 龙江县| 荆门市| 石嘴山市| 蒙城县| 石阡县| 敦煌市| 安庆市| 增城市| 天峨县| 巴楚县| 沙田区| 佛教| 西乌| 沙雅县| 潞西市| 富民县|