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

目录
  • persistence.xml配置文件修改存放路径
    • 解决办法有两种
  • 持久化persistence.xml配置文件
    • 扩展(persistence-unit)

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • spring+Jpa多数据源配置的方法示例

    今天临下班时遇到了一个需求,我的管理平台需要从不同的数据库中获取数据信息,这就需要进行Spring的多数据源配置,对于这种配置,第一次永远都是痛苦的,不过经历了这次的折磨,今后肯定会对这种配置印象深刻.我们这里简单回顾一下流程. 我们配置了两个数据库,一个是公司的数据库,另一个是我本地的一个数据库.首先是application.yml的配置(其中对于公司的数据库我们采取了假的地址,而本机的数据库是真是存在对应的表和库的) 数据库信息: 数据表信息: 1.application.yml datas

  • Spring Boot中使用Spring-data-jpa的配置方法详解

    为了解决这些大量枯燥的数据操作语句,我们第一个想到的是使用ORM框架,比如:hibernate.通过整合Hibernate之后,我们以操作Java实体的方式最终将数据改变映射到数据库表中. 为了解决抽象各个Java实体基本的"增删改查"操作,我们通常会以泛型的方式封装一个模板Dao来进行抽象简化,但是这样依然不是很方便,我们需要针对每个实体编写一个继承自泛型模板Dao的接口,再编写该接口的实现.虽然一些基础的数据访问已经可以得到很好的复用,但是在代码结构上针对每个实体都会有一堆Dao的

  • JPA配置详解之jpaProperties用法

    目录 JPA配置之jpaProperties Sping Data Jpa配置问题 spring.jpa.properties.hibernate.hbm2ddl.auto=update JPA配置之jpaProperties <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmln

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

    目录 persistence.xml配置文件修改存放路径 解决办法有两种 持久化persistence.xml配置文件 扩展(persistence-unit) persistence.xml配置文件修改存放路径 今天整合Spring.struts2和Spring Data JPA的时候遇到以下问题,现记录以供参考. <!-- 定义实体管理工厂bean --> <bean id="entityManagerFactory" class="org.spring

  • IDEA如何修改配置文件的存放位置

    目录 如何修改配置文件的存放位置 IDEA读取配置文件 1.在IDEA中当使用以下代码读取配置文件时 2.创建资源文件 如何修改配置文件的存放位置 IDEA配置文件默认是放在C盘的,修改存放位置,这样系统重装的时候就不会不见了. 找到你IDEA的安装目录,进入bin目录,找到idea.properties文件打开. 去掉下面这两行路径前的注释,修改路径为你想存放的路径. 重新打开IDEA即可. IDEA读取配置文件 1.在IDEA中当使用以下代码读取配置文件时 无论配置文件放在哪个位置代码都找不

  • IDEA设置maven修改settings.xml配置文件无法加载仓库的解决方案

    出处:https://www.cnblogs.com/SunSpring 作为初学者配置maven一般网上搜索.然后你就看到各种配置文件片段,首先配置镜像,然后配置仓库.完事后再IDEA里面配置下maven的路径和配置文件路径. 这些文章属实坑爹,完全没讲一个重要的配置就是activeProfiles. 当我配置了各种,捣腾了半天,idea里面死活加载不进去我配置的仓库信息. 最后配置好activeProfiles就行了,这个基本99%的文章都没讲过要配置,自己不仔细去看文档就会掉入陷阱. ac

  • 如何修改logback.xml配置文件在resource以外的位置

    因为spring搭建的web项目打包时默认将resource文件夹下的文件一起打包,但是我们又想在打包后修改某些配置 这里以我遇到的logback.xml配置更改默认路径来看 根据LoggerFactory.getLogger的方法找到加载文件的位置,如下 public URL findURLOfDefaultConfigurationFile(boolean updateStatus) { ClassLoader myClassLoader = Loader.getClassLoaderOfO

  • docker 文件存放路径, 修改端口映射操作方式

    如何获取容器的启动命令 容器早已创建好,如何得知它的启动参数(数据挂载到哪) #假设通过如下命令启动了一个容器 docker run -d --name mysql_cdh \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=123456 \ -v mysql-data:/var/lib/mysql \ --restart=always \ mysql:5.5 --character-set-server=utf8 #如何通过容器名得知启动参数 [root@jenki

  • 通过VS下载的NuGet包修改其下载存放路径的操作方法

    目录 一.了解NuGet包的默认存放路径 二.为什么需要修改NuGet包的默认存放路径? 三.更改下载的NuGet包存储位置 四.修改VS离线包引用地址 五.验证修改的新路径是否成功 一.了解NuGet包的默认存放路径 我们通过NuGet包管理器下载的引用包,默认是存放在C盘的,存储路径一般是: C:\Users\{系统用户名}\.nuget\packages 二.为什么需要修改NuGet包的默认存放路径? 最直接的答案便是——节省C盘存储资源,减缓C盘飚红速度. 我们都知道,C盘的存储资源是有

  • Maven中pom.xml配置文件详细介绍

    setting.xml主要用于配置maven的运行环境等一系列通用的属性,是全局级别的配置文件:而pom.xml主要描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和licenses,以及其他所有的项目相关因素,是项目级别的配置文件. 基础配置 一个典型的pom.xml文件配置如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org

  • 详述 tomcat 中的 server.xml 配置文件示例

    正文 1 前言 Tomcat 隶属于 Apache 基金会,是开源的轻量级 Web 应用服务器,使用非常广泛.server.xml是 Tomcat 中最重要的配置文件,server.xml的每一个元素都对应了 Tomcat 中的一个组件:通过对 XML 文件中元素的配置,可以实现对 Tomcat 中各个组件的控制.因此,学习server.xml文件的配置,对于了解和使用 Tomcat 至关重要. 本文将通过实例,介绍server.xml中各个组件的配置,并详细说明 Tomcat 各个核心组件的作

  • Logback日志存放路径不统一解决方案

    问题: 将一个应用程序打成了Jar包后,使用命令运行jar包,发现日志存放的路径并不统一: 比如 hello.jar 包放在 /aaa/bbb 目录下 如果在 /aaa/bbb 目录下执行:java -jar hello.jar ,那么日志就会存放在 /aaa/bbb 目录下 如果在 /aaa 目录下执行:java -jar bbb/hello.jar ,那么日志就会存放在 /aaa 目录下 如何才能不同位置执行jar包,但是日志放到一个统一的目录中呢? 解决过程: 查看logback.xml中

  • docker文件存放路径, 获取容器启动命令操作

    容器早已创建好,如何得知它的启动参数(数据挂载到哪) #假设通过如下命令启动了一个容器 docker run -d --name mysql\ -p 3306:3306\ -e MYSQL_ROOT_PASSWORD=123456\ --restart=always\ mysql:5.5 --character-set-server=utf8 #如何通过容器名得知启动参数 [root@jenkins ~]# docker inspect mysql_cdh [ { "Id": &quo

随机推荐