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來年的發展歷程了,而領域建模思想是近幾年才興起的,這種思想更加的面向對象