JPA持久化persistence.xml配置文件即參數詳解



Java Persistence API:持久性單元(Persistence Units)

如果你打算在你的應用中使用JPA,你就需要使用持久性單元(Persistence Units)。持久性單元具有唯一的名稱,負責定義應用中的一組實體如何進行管理和持久性。在應用中使用persistence.xml文件來設置持久性單元,可以配置多個持久性單元,但每個單元擁有唯一的名稱。

持久性單元包含的屬性有:

  • 在該持久性單元範圍(作用域)內的實體類

  • 爲上述實體類提供持久性的持久性提供者(Persistence Provider)或庫

  • 上述實體類的數據源(Data Source)

  • 應用使用的事務類型(Transaction Type)

持久性單元能夠被打包成WAR文件,EJB-JAR文件,EAR文件的一部分,或者直接打包成應用程序能夠直接使用的JAR文件。

持久性單元的範圍(作用域)取決於persistence.xml文件的位置。一般說來,IDE能夠使用引導界面來正確放置persistence.xml的位置。例如使用IDE爲EJB模塊(Module)創建的持久性單元,persistence.xml文件將被放在EJB模塊的src/conf目錄中,當你將模塊打包時,persistence.xml文件被放在EJB JAR文件的META-INF目錄中。這樣持久性單元的作用域就是EJB JAR文件中的類。

注意:persistence.xml文件的位置決定持久性的根(Persistence Root)。持久性的根爲JAR文件或者包含META-INF目錄(前提是persistence.xml位於此)的目錄。

持久性提供者(Persistence Provider)

持久性提供者指的是JPA的實現。持久性提供者是一個能夠爲應用提供持久性對象的的庫。例如Netbeans綁定了TopLink Essentials 作爲持久性提供者,同時TopLink Essentials也是Sun Java System Application Server Platform Edition 9 (Glassfish)的參考實現和默認配置。TopLink Essentials包括toplink-essentials.jar和toplink-essentials-agent.jar兩個JAR文件。你可以使用別的持久性提供者例如Hibernate。

數據源

數據源指的是提供實體存儲的數據庫。數據源必須在服務器中註冊並且使用JNDI名稱指定。如果事務是由容器管理的JTA事務
那麼數據源必須是JTA數據源。如果事務是應用負責管理的,數據源根據在IDE中註冊的JDBC數據庫連接指定。
在Java SE環境下,數據庫可以通過數據源指定,也可以使用其他方法,取決於持久性提供者的要求。

事務類型

持久性單元指定事務是如何管理的。事務類型取決於目標容器,如果目標容器是Java EE容器,你可以使用容器管理或者應用管理。如果不是這樣的話,你只能使用應用管理。

  • 容器管理的事務(JTA事務)

容器使用Java Transaction API來管理事務。你必須將你的應用部署在Java EE容器中,並且你的數據源必須支持JTA。
persistence.xml中事務類型被設置爲JTA.如果你使用Glassfish這個是默認選項。

  • 應用管理的事務(本地資源事務:Resource-Local Transaction)

由應用負責事務處理。在persistence.xml文件中,被設置爲RESOUCE_LOCAL



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

  

<persistence version="1.0"  

xmlns:persistence="http://java.sun.com/xml/ns/persistence"  

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

xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_1_0.xsd ">   

<!-- Name屬性用於定義持久化單元的名字 (name必選,空值也合法);

transaction-type 指定事務類型(可選)-->  

<persistence-unit name="unitName" transaction-type="JTA">    

   <!-- 描述信息.(可選) -->  

   <description> </description>   

   <!-- javax.persistence.PersistenceProvider接口的一個實現類(可選) -->  

   <provider>   </provider>  <!-- 指定一個持久化提供者 -->   

   <!-- Jta-data-source和 non-jta-data-source用於分別指定持久化提供商使用的JTA和/或non-JTA數據源的全局JNDI名稱(可選) -->  

   <jta-data-source>java:/MySqlDS</jta-data-source>  

   <non-jta-data-source> </non-jta-data-source>   

   <!-- 聲明orm.xml所在位置.即指定映射文件 (可選) -->  

   <mapping-file>product.xml</mapping-file>  

   <!-- 以包含persistence.xml的jar文件爲基準的相對路徑,添加額外的jar文件.指定託管類的附加JAR(可選) -->  

   <jar-file>../lib/model.jar</jar-file>    

   <!-- 顯式列出實體類,在Java SE 環境中應該顯式列出.(可選) -->  

   <class>com.domain.User</class>  

   <class>com.domain.Product</class>    

   <!-- 聲明是否掃描jar文件中標註了@Enity類加入到上下文.若不掃描,則如下:(可選) -->  

   <exclude-unlisted-classes/>    

   <!--   廠商專有屬性(可選)   -->  

   <properties>  

   <!--自動輸出schema創建DDL語句 value的值可以是 create-drop / create / update  

值得注意的是create-drop他會在SESSION關閉後刪除所有表開啓式再創建。 -->

    <property name="hibernate.hbm2ddl.auto" value="update" />  

    <property name="hibernate.show_sql" value="true" />  

   </properties>  

</persistence-unit>   

</persistence>


通常在企業開發中,有兩種做法: 

  • 1.先建表,後再根據表來編寫配置文件和實體bean。使用這種方案的開發人員受到了傳統數據庫建模的影響。

  • 2.先編寫配置文件和實體bean,然後再生成表,使用這種方案的開發人員採用的是領域建模思想,這種思想相對前一種思想更加OOP


   建議使用第二種(領域建模思想),從軟件開發來想,這種思想比第一種思想更加面向對象。 領域建模思想也是目前比較新的一門建模思想,第一種是傳統的建模思想,已經有10來年的發展歷程了,而領域建模思想是近幾年才興起的,這種思想更加的面向對象


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章