簡體   English   中英

了解JPA中的Persistence.xml

[英]Understanding Persistence.xml in JPA

我想了解以下事項:

當我創建EJB項目並將其部署到Glassfish時,我是否在Glassfish的管理員中心設置了JDBC資源/連接池,還是在persistence.xml中添加了用戶名,密碼等所有不同的屬性? 我不明白這一點。

我不明白為什么我們同時擁有JDBC資源和JDBC連接池。 它是什么,它們之間有什么區別? 有人可以解釋我這些事情或/並提供一些關於persistence.xml文件及其周圍部分的良好鏈接嗎?

最好定義JDBC資源,而不是將信息放在persistence.xml中。 通過這種方式,您將利用連接池。 您將在persistence.xml中定義為JDBC資源提供的JNDI名稱。

它是什么,它們之間有什么區別

下面我粘貼了Glassfish 3.x幫助的一些部分。 看看這個。 這真的很有幫助

JDBC連接池

JDBC連接池包含在注冊連接池時創建的一組JDBC連接

JDBC資源

Java數據庫連接(JDBC)資源(數據源)為應用程序提供了連接數據庫的方法。 通常,管理員為域中部署的應用程序訪問的每個數據庫創建JDBC資源; 但是,可以為數據庫創建多個JDBC資源。

應用程序通過在Java命名和目錄接口(JNDI)API樹上查找數據源,然后請求連接,從連接池獲取數據庫連接。 與數據源關聯的連接池提供與應用程序的連接。

將數據源(JDBC)資源視為某種類型的數據服務(連接池)的外觀的工廠。 在這種情況下,它隱式地從池中獲取連接並將其提供給您的應用程序。

persistence.xml示例:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="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 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="WebApplication2PU" transaction-type="JTA">
    <jta-data-source>jdbc/sample</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties/>
  </persistence-unit>
</persistence>

這一行是我給我的JDBC資源的JNDI名稱:

 <jta-data-source>jdbc/sample</jta-data-source>

您不需要以這種方式在persistence.xml中定義與數據庫連接相關的任何內容......只需要資源的JNDI名稱

我在閱讀的書中發現了這一點,以學習Spring和Hibernate。 書名是由Nicholas S. Williams編寫的專業Java for Web Applications 我認為這對很多人都有幫助。

創建持久性配置:

要使用您創建的實體,必須定義持久性單元。 這樣做很簡單。 創建一個與部署描述符不同的persistence.xml文件,但要擔心的選項要少得多。 持久性配置文件的根元素是<persistence> 該元素可以包含一個或多個<persistence-unit>元素。 <persistence>沒有其他元素。 <persistence-unit>有兩個屬性:name指定持久性單元的名稱,transaction-type指示此持久性單元是使用Java Transaction API(JTA)事務還是標准本地事務。 您必須指定一個名稱,這是您在代碼中找到持久性單元的方式。 如果未指定,則transaction-type缺省為Java EE應用程序服務器中的JTA和Java SE環境中的RESOURCE_LOCAL或簡單Servlet容器。 但是,為了防止意外行為,最好始終顯式設置此值,而不是依賴於默認值。 <persistence-unit>包含以下內部元素。 它們都不是必需的(因此<persistence-unit>可能為空); 但是,您必須按以下順序指定您使用的元素:

  • <description>包含此持久性單元的有用描述。 雖然它使得讀取持久性文件更容易,但它沒有語義價值。
  • <provider>指定用於此持久性單元的javax.persistence.spi .PersistenceProvider實現的完全限定類名。 默認情況下,當您查找持久性單元時,API將使用類路徑上的第一個JPA提供程序。 您可以包含此元素以強制要求特定的JPA提供程序。

  • 您可以使用<jta-data-source><non-jta-data-source> (但不能同時使用兩者)來使用JNDI DataSource資源。 僅當事務類型為JTA時,才可以使用<jta-data-source> ; 同樣,只有當transaction-type為RESOURCE_LOCAL時,才可以使用<non-jta-data-source> 指定DataSource會導致持久性單元將該DataSource用於所有實體操作。

  • <mapping-file>指定XML映射文件的類路徑相對路徑。 如果未指定任何<mapping-file> ,則提供程序將查找orm.xml。 您可以指定多個<mapping-file>元素以使用多個映射文件。

  • 您可以使用一個或多個<jar-file>元素來指​​定JPA提供程序應掃描映射注釋實體的JAR文件或JAR文件。 找到的任何@ Entity,@ Embeddable,@ javax.persistence.MappedSuperclass或@javax.persistence.Converter類都會添加到持久性單元中。

  • 您可以使用一個或多個<class>元素來指​​示應添加到持久性單元的特定@Entity,@ Embeddable,@ MappedSuperclass或@Converter類。 您必須使用JPA注釋注釋一個或多個類。

  • 使用<exclude-unlisted-classes /><exclude-unlisted-classes>true</exclude-unlisted-classes>表示提供程序應忽略未使用<jar-file><class>指定的<class> 省略<exclude-unlisted-classes>或使用<exclude-unlisted-classes>false</exclude-unlisted-classes>會導致JPA提供程序掃描持久性文件的類路徑位置以獲取JPA注釋的類。 如果persistence.xml位於JAR文件中,則會掃描該JAR文件(以及僅該JAR文件)的類。 如果persistence.xml位於基於目錄的類路徑位置(例如/ WEB-INF / classes),則會掃描該目錄(並且僅針對該目錄)的類。 在Hibernate 4.3.0和Spring Framework 3.2.5之前,使用值false指定此元素被錯誤地解釋為true。

  • <shared-cache-mode>表示實體如何在持久性單元中緩存(如果JPA提供程序支持緩存,這是可選的)。 NONE禁用緩存,而ALL啟用所有實體的緩存。 ENABLE_SELECTIVE意味着只緩存注釋了@javax .persistence.Cacheable或@Cacheable(true)(或在orm.xml中標記為可緩存)的實體。 DISABLE_SELECTIVE導致除了帶注釋的@Cacheable(false)之外的所有實體的緩存(或在orm.xml中標記為不可緩存)。 默認值UNSPECIFIED,表示JPA提供程序決定有效默認值。 Hibernate ORM默認為ENABLE_SELECTIVE,但依賴於此是不可移植的。

  • <validation-mode>指示是否以及如何將Bean Validation應用於實體。 NONE表示未啟用Bean Validation,而CALLBACK使提供程序在插入,更新和刪除時驗證所有實體。 如果類路徑上存在Bean Validation提供程序,則AUTO具有CALLBACK的有效值,如果類路徑上不存在Bean Validation提供程序,則AUTO的有效值為NONE。 如果啟用驗證,JPA提供程序將配置新的Validator以驗證您的實體。 如果您使用自定義本地化錯誤代碼配置了特殊的Spring Framework Validator,則JPA提供程序會忽略它。 因此,最好將驗證模式設置為NONE,並在調用持久層之前使用Bean Validation。

  • <properties>提供了一種指定其他JPA屬性的方法,包括標准JPA屬性(例如JDBC連接字符串,用戶名和密碼或模式生成設置)以及特定於提供程序的屬性(例如Hibernate設置)。 您可以使用嵌套元素指定一個或多個屬性,每個元素都具有名稱和值屬性。

Nicholas S. Williams, Professional Java for Web Applications, (Indianapolis, Indiana: John Wiley & Sons, Inc., 2014), pg 584-585

在應用程序服務器中配置數據源時,需要在persistence.xml設置的所有內容都是該數據源的JNDI名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM