首頁 > 軟體

解決persistence.xml組態檔修改存放路徑的問題

2022-02-24 22:00:14

persistence.xml組態檔修改存放路徑

今天整合Spring、struts2和Spring Data JPA的時候遇到以下問題,現記錄以供參考。

<!-- 定義實體管理工廠bean -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="demo" />
<property name="persistenceXmlLocation" value="classpath:persistence.xml" />
</bean>

按以上程式碼設定實體管理工廠時將會丟擲異常,大意就是找不到persistence.xml檔案。

因為我的persistence.xml檔案是放在與src同級的resource資料夾內的,而預設會去src下META-INF資料夾載入該組態檔。

解決辦法有兩種

1、第一種:

將persistence.xml檔案移至src/META-INF/下,若不存在該資料夾則手動建立;

2、第二種:

org.springframework.orm.jpa.LocalEntityManagerFactoryBean

改為

org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean

如果要了解實現原理,請自行檢視原始碼。 

持久化persistence.xml組態檔

在EJB中,一個實體Bean應用由實體類和persistence.xml檔案檔案組成。persistence.xml檔案在jar檔案的META-INF目錄下。persistence.xml檔案指定實體Bean使用的資料來源及Entity Manager物件的預設行為。

我們來看一個最簡單的persistence.xml檔案,瞭解一下它的設定。

<persistence>
  <!-- Name屬性用於定義持久化單元的名字 (name必選,空值也合法) -->
  <persistence-unit name="foshanshop">  
    <!-- Jta-data-source 用於指定持久化提供商使用的JTA資料來源的全域性JNDI名稱(可選) --> 
    <jta-data-source>java:/DefaultMySqlDS</jta-data-source>  
    <!-- 廠商專有屬性(可選) --> 
    <properties>    
      <!--自動輸出schema建立DDL語句 -->
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/>      
    </properties>    
  </persistence-unit>  
</persistence>
  • persistence-unit:節點可以有一個或多個,每個persistence-unit 節點定義了持久化內容名稱、使用的資料來源以及持久化產品的專有屬性。
  • name:屬性定義持久化名稱。
  • jta-data-source:節點指定實體Bean使用的資料來源JNDI名稱,如果應用釋出在jboss下,資料來源名稱就必須帶有java:/字首,資料來源名稱大小寫敏感。
  • properties:節點用作指定持久化產品的各項屬性。

對於properties 節點需要說明的是,各個應用伺服器使用的持久化產品都不一樣,如jboss使用的是hibernate,weblogic10使用的是kodo。因為jboss採用了hibernate,hibernate有一項屬性"hibernate.hbm2ddl.auto",該屬性指定實體Bean釋出時是否同步資料庫結構,如果"hibernate.hbm2ddl.auto"的值設為“create-drop”,在實體釋出及解除安裝時將自動建立及刪除相應資料庫表。

jboss伺服器啟動或關閉時也會引發實體Bean的釋出及解除安裝。

ps:如果你的表已經存在,並且想保留資料,釋出實體 bean 時可以把 hibernate.hbm2ddl.auto 的值設為 none 或update,以後為了實體 bean 的改動能反應到資料表,建議使用 update,這樣實體 Bean 新增一個屬性時能同時在資料表增加相應欄位。

擴充套件(persistence-unit)

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

  • 在該持久化單元範圍(作用域)內的實體類
  • 為實體類提供持久化的持久化提供者(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檔案中的類。

ps:persistence.xml檔案的位置決定持久化的根(Persistence Root)。持久化的根為JAR檔案或者包含META-INF目錄(前提是persistence.xml位於此)的目錄。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com