在JPA

2011-10-14 20 views
4

我想了解以下事物的認識的persistence.xml:在JPA

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

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

回答

4

最好是定義一個JDBC資源,而不是將信息放在persistence.xml中。這樣你就可以利用連接池。您將定義您在persistence.xml中爲JDBC資源提供的JNDI名稱。

這是什麼,什麼是他們

之間的差異下面我粘貼的Glassfish的3.x的幫助某些部分。一探究竟。這是真正有用的

JDBC連接池

JDBC連接池包含在連接池註冊

JDBC資源

Java數據庫所創建的一組JDBC連接連接(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> 

此行是JNDI名稱我給我的JDBC地質礦產:

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

你不需要定義與數據庫連接的東西persistence.xml這種方式...只是資源的JNDI名稱

+0

謝謝!現在有點清楚了。所以連接屬性的細節在兩個地方都是一樣的?但是將這些細節遠離代碼更方便嗎? (如果您有時間我在Java聊天頻道) – LuckyLuke

+0

由於您要在Glassfish中部署應用程序,因此您希望您的連接由Glassfish中配置的數據源(JDBC資源)提供,而不是直接從您的應用程序打開連接。您可以定義一個,但是您希望由Glassfish提供的連接自動管理您的交易。使用應用程序服務器,您可以自動管理事務,以便使用jta-data-source。 – DaTroop

+0

您可以從事務管理代碼以及persistence.xml中的許多配置屬性(數據庫憑證,url等)中保存自己,最後在連接池配置中設置該屬性。 – DaTroop

0

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

+0

謝謝你,但你可以請詳細說明你的答案嗎?設置文件中的所有屬性和添加JNDI名稱之間有什麼區別。我有很多問題沒有得到回答。 – LuckyLuke

+0

好,不同之處在於應用服務器創建並管理它。 – Bozho

+0

但是這兩個地方的「配置」是一樣的嗎?只是將它的細節移出應用程序? (可用於聊天Java室) – LuckyLuke

0

我在閱讀中學習Spring和Hibernate的書中發現了這個。書名是專業Java for Web應用程序編寫Nicholas S. Williams。我認爲這對很多人會有幫助。

創建持久性配置:

要使用您創建的實體,您必須定義持久性單元。這樣做很簡單。創建一個 persistence.xml文件與部署描述符沒有不同,但要擔心的選項要少得多。持久性配置文件的根元素是<persistence>。這個元素可能包含一個或多個<persistence-unit>元素。 <persistence>內沒有其他元素 。 <persistence-unit>有兩個屬性:name指定持久性單元的名稱 ,並且事務類型指示此持久性單元是否使用Java 事務API(JTA)事務或標準本地事務。 您必須指定一個名稱,這是您在代碼中定位持久性單元的方式。如果未指定,則 事務類型在Java EE應用程序服務器中默認爲JTA,在默認情況下爲Java SE或簡單Servlet容器中的RESOURCE_LOCAL。但是,爲了防止意外的行爲,最好 總是明確地設置此值,而不是依賴於默認值。 <persistence-unit>包含以下內部元素。它們都不是必需的(因此 <persistence-unit>可能爲空);然而,你必須指定你在 以下順序使用的任何元素:

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

  • 您可以使用<jta-data-source><non-jta-data-source>(但不能同時使用)到 使用JNDI數據源資源。僅當 交易類型爲JTA時,纔可以使用<jta-data-source>;同樣,如果事務類型爲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>指定的類不 。省略<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中標記爲不可緩存)的所有實體。缺省值爲 ,表示JPA提供程序決定有效缺省值是什麼。休眠 ORM默認爲ENABLE_SELECTIVE,但依賴於此不可移植。

  • <validation-mode>指示是否以及如何將Bean驗證應用於實體。 NONE表示未啓用Bean驗證,而CALLBACK則使供應商 在插入,更新和刪除時驗證所有實體。如果類路徑中存在Bean驗證提供程序,則AUTO的值爲CALLBACK ,如果類路徑中不存在 Bean驗證提供程序,則AUTO的有效值爲NONE。如果啓用驗證,JPA提供商 會配置一個新的驗證器來驗證您的實體。如果您使用自定義的本地化錯誤代碼配置了特殊的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