解决persistence.xml配置文件修改存放路径的问题


Posted in Java/Android onFebruary 24, 2022

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位于此)的目录。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Java/Android 相关文章推荐
Java Dubbo框架知识点梳理
Jun 26 Java/Android
Java Kafka 消费积压监控的示例代码
Jul 01 Java/Android
swagger如何返回map字段注释
Jul 03 Java/Android
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
Sep 25 Java/Android
关于Spring配置文件加载方式变化引发的异常详解
Jan 18 Java/Android
Spring this调用当前类方法无法拦截的示例代码
Mar 20 Java/Android
关于EntityWrapper的in用法
Mar 22 Java/Android
Android自定义scrollview实现回弹效果
Apr 01 Java/Android
Java 写一个简单的图书管理系统
Apr 26 Java/Android
Java 异步任务计算FutureTask
Apr 28 Java/Android
springboot创建的web项目整合Quartz框架的项目实践
Jun 21 Java/Android
Spring Cloud OpenFeign模版化客户端
Jun 25 Java/Android
Java实现学生管理系统(IO版)
alibaba seata服务端具体实现
Feb 24 #Java/Android
java协程框架quasar和kotlin中的协程对比分析
Feb 24 #Java/Android
springmvc直接不经过controller访问WEB-INF中的页面问题
Feb 24 #Java/Android
正则表达式拆分url实例代码
Feb 24 #Java/Android
mybatis源码解读之executor包语句处理功能
Feb 15 #Java/Android
java executor包参数处理功能 
Feb 15 #Java/Android
You might like
虫族 Zerg 魔法科技
2020/03/14 星际争霸
PHP动态变静态原理
2006/11/25 PHP
PHP设置图片文件上传大小的具体实现方法
2013/10/11 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
简单实用的js调试logger组件实现代码
2010/11/20 Javascript
jquery 学习之二 属性 文本与值(text,val)
2010/11/25 Javascript
javascript错误的认识不用关心内存管理
2012/12/15 Javascript
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
对之前写的jquery分页做下升级
2014/06/19 Javascript
JQuery勾选指定name的复选框集合并显示的方法
2015/05/18 Javascript
jQuery中设置form表单中action值的实现方法
2016/05/25 Javascript
Node.js读写文件之批量替换图片的实现方法
2016/09/07 Javascript
微信开发 使用picker封装省市区三级联动模板
2016/10/28 Javascript
微信小程序-消息提示框实例
2016/11/24 Javascript
bootstrap datetimepicker实现秒钟选择下拉框
2017/01/05 Javascript
jQuery Tree Multiselect使用详解
2017/05/02 jQuery
Vue 表单控件绑定的实现示例
2017/08/11 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
es6函数中的作用域实例分析
2020/04/18 Javascript
[01:17:55]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
Python执行时间的计算方法小结
2017/03/17 Python
Python利用字典破解WIFI密码的方法
2019/02/27 Python
Python TCPServer 多线程多客户端通信的实现
2019/12/31 Python
基于python实现matlab filter函数过程详解
2020/06/08 Python
viagogo法国票务平台:演唱会、体育比赛、戏剧门票
2017/03/27 全球购物
wedgwood加拿大官网:1759年成立的英国国宝级陶瓷餐具品牌
2018/07/17 全球购物
如何判断一段程序是由C 编译程序还是由C++编译程序编译的
2013/08/04 面试题
介绍下Java中==和equals的区别
2013/09/01 面试题
教师党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2015年医务人员医德医风自我评价
2015/03/03 职场文书
小学总务工作总结
2015/08/13 职场文书
信息技术研修心得体会
2016/01/08 职场文书
忘记Grafana不要紧2种Grafana重置admin密码方法详细步骤
2022/04/07 Servers
Win11 Build 25179预览版发布(附更新内容+ISO官方镜像下载)
2022/08/14 数码科技