解決persistence.xml配置文件修改存放路徑的問題
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位於此)的目錄。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 新建springboot項目時,entityManagerFactory報錯的解決
- JPA配置詳解之jpaProperties用法
- 解決Spring Data Jpa 實體類自動創建數據庫表失敗問題
- JPA如何設置表名和實體名,表字段與實體字段的對應
- Spring boot基於JPA訪問MySQL數據庫的實現