原文地址:http://www.cnblogs.com/taven/p/3351841.html

JPA 不在 persistence.xml 文件中配置每个Entity实体类的2种解决办法

在Spring 集成 Hibernate 的JPA方式中,需要在persistence配置文件中定义每一个实体类,这样非常地不方便,远哥目前找到了2种方法。
这2种方式都可以实现不用persistence.xml文件,免去每个Entity都要在persistence.xml文件中配置的烦恼,但是这种方式Entity实体类的主键字段注解@ID要放到 getXXX()方法上,否则不认。
方式1:
修改“LocalContainerEntityManagerFactoryBean”的配置,如下:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="packagesToScan" value="com.pilicat.data.entity" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.connection.driver_class">${jdbc.driverClassName}</prop>
<prop key="hibernate.connection.url">${jdbc.url}</prop>
<prop key="hibernate.connection.username">${jdbc.username}</prop>
<prop key="hibernate.connection.password">${jdbc.password}</prop>
<prop key="hibernate.c3p0.min_size">10</prop>
<prop key="hibernate.hbm2ddl.auto">true</prop>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
</props>
</property>
</bean>

方式1没有使用 persistence 配置文件,注意咯!
方式2:
修改“LocalContainerEntityManagerFactoryBean”的配置,如下:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="persistenceXmlLocation" value="classpath:persistence-app.xml" />
<!-- <property name="persistenceUnitName" value="pilicat_app_jpa" /> -->
<property name="packagesToScan" value="com.pilicat.data.entity" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="${hibernate.dialect}" />
<property name="generateDdl" value="false" />
</bean>
</property>
</bean>
persistence-app.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="pilicat_app_jpa" transaction-type="RESOURCE_LOCAL">

<properties>
<property name="hibernate.max_fetch_depth" value="3" />
<property name="hibernate.jdbc.fetch_size" value="50" />
<property name="hibernate.jdbc.batch_size" value="50" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="false" />
</properties>
</persistence-unit>

</persistence>

方式2使用了 persistence 配置文件,去掉“persistenceUnitName”属性,添加“packagesToScan”属性,persistence.xml配置文件中的persistence-unit名字照样保留,但是 persistence 配置文件中不需要对实体类进行配置,会自动识别。
为什么去掉“persistenceUnitName”属性就可以自动识别实体了呢?看一下Spring的源码就知道了:
类名:org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager
代码段:
private List<SpringPersistenceUnitInfo> readPersistenceUnitInfos() {
    List<SpringPersistenceUnitInfo> infos = new LinkedList<SpringPersistenceUnitInfo>();
    boolean buildDefaultUnit = (this.packagesToScan != null || this.mappingResources != null);
    PersistenceUnitReader reader = new PersistenceUnitReader(this.resourcePatternResolver, this.dataSourceLookup);
    SpringPersistenceUnitInfo[] readInfos = reader.readPersistenceUnitInfos(this.persistenceXmlLocations);
    for (SpringPersistenceUnitInfo readInfo : readInfos) {
        infos.add(readInfo);
        if (this.defaultPersistenceUnitName != null &&
                this.defaultPersistenceUnitName.equals(readInfo.getPersistenceUnitName())) {
            buildDefaultUnit = false;
        }
    }
    if (buildDefaultUnit) {
        infos.add(buildDefaultPersistenceUnitInfo());
    }
    return infos;
}

注意看这个源码的方法,defaultPersistenceUnitName 变量如果不为空,并且等于 persistence 配置文件中的持久化单元名称,则buildDefaultUnit就为false,buildDefaultUnit 如果为 false,是不会执行 buildDefaultPersistenceUnitInfo() 方法的,而 buildDefaultPersistenceUnitInfo() 方法是根据我们定义的 packagesToScan 去自动扫描Entity实体类的。  

注:我使用的是 Spring 3.2.4
以上2种方法都测试通过,还有没有更简单的办法呢?你也可以将您的方式告诉远哥,或在远哥的博客下方留言,欢迎大家交流分享,谢谢。

转载于:https://www.cnblogs.com/AloneSword/p/4558231.html

JPA 不在 persistence.xml 文件中配置每个Entity实体类的2种解决办法相关推荐

  1. 不在JPA 的 persistence.xml 文件里配置Entity class的解决的方法

     在Spring 集成 Hibernate 的JPA方式中,须要在persistence配置文件里定义每个实体类.这样很地不方便.2种方法能够解决此问题: 这2种方式都能够实现不用在persist ...

  2. 在web.xml文件中配置Servlet时,主要配置哪些信息?

    web前端的学习内容是比较多的,其中有一部分就是关于在web.xml文件中配置Servlet时的相关内容,在web.xml文件中配置Servlet时,主要配置哪些信息?来看看下面的详细介绍. 使用ID ...

  3. Tomcat在自定义xml文件中配置虚拟目录

    在实际开发中,如果,经常在server.xml文件中,配置虚拟目录会有一个弊端 就是,每次修改server.xml文件之后,想要文件生效,必须重新启动Tomcat服务器 为了解决这个问题,可以采用另外 ...

  4. Spring 在xml文件中配置Bean

    Spring容器是一个大工厂,负责创建.管理所有的Bean. Spring容器支持2种格式的配置文件:xml文件.properties文件,最常用的是xml文件. Bean在xml文件中的配置 < ...

  5. CAD软件中坐标Z轴归零问题的两种解决办法

    相信这个问题困扰过很多人, 下面是我总结了一些解决办法, 很好用,都试过了,在这里和大家分享一下, 希望以后不要再在这个问题上浪费时间了 第一种: 1.ELEV--标高和厚度都设为0 2.天正:工具( ...

  6. cs文件中窗体设计器不见了,终于找到解决办法了。

    C# 窗体为 Form1.cs,下面有2个文件.如图 看,Form1.cs文件前面的图标是窗口.今天早上它突然变成和下面的Program.cs文件一样的C#图标了.双击文件没有显示窗口的设计窗口,只显 ...

  7. asp.net中URL参数传值中文乱码的三种解决办法

    在做Asp.Net开发的时候,参数传递中文时,经常会遇到页面乱码的问题,下面是在网上收集的相关资料,请大家参考: 解决的方法一般有3种: 1.设置web.config文件 <system.web ...

  8. mysql模糊查询xml_在userMapper.xml文件中模糊查询的常用的3种方法

    在userMapper.xml文件中新建映射sql的标签 select from users name like "%"#{name}"%" and phone ...

  9. JPA persistence.xml 文件初学者指南

    介绍 在本文中,我将解释 JPA persistence.xml配置文件的用途,以及如何使用可用的 XML 标记或属性设置 Java Persistence 应用程序. 虽然 Spring 应用程序可 ...

最新文章

  1. 白帽子讲Web安全(纪念版)
  2. 共享单车取消月卡优惠 烧钱时代正式结束
  3. 【C/C++多线程编程之六】pthread互斥量
  4. 使用 Ajax 实现本地化后的客户端消息验证
  5. 前端学习(1355) 子模板
  6. suse 9 图形安装出现4画面
  7. LINQ-sql的终极疯狂
  8. ios sandbox
  9. 用python读取图像_如何用python获取图像
  10. 试用EF开发WEB应用程序(15): EF Servlet, or EFSP?
  11. 所以,我们依然要读书
  12. Java Applet Reflection Type Confusion Remote Code Execution
  13. Mybatis动态标签基本使用
  14. 韩顺平java基础学习笔记
  15. zemax设置 像方远心_ZEMAX|如何翻转整个光学系统
  16. 解决Iphonex 底部按钮fixed,bottom:0 底部留白问题
  17. SAMBA配置 “你可能没有权限访问网络资源”的问题解决方法
  18. snapchat_如何查看谁查看了Snapchat故事并对其进行了截图
  19. meta标签http-equiv属性的作用
  20. 一道受用终身的测试题

热门文章

  1. 嵌入式操作系统内核原理和开发(内存分配算法)
  2. HDU -2243 考研路茫茫——单词情结(AC自动机+矩阵快速幂)
  3. Redis设计与实现AOF持久化
  4. Mysql存储引擎原理
  5. 坑 之 TypeError: List of Tensors when single Tensor expected
  6. mysql的binary、char、varchar区别
  7. dnf 跨服 服务器 位置,dnf2017跨区表_2017dnf90级版本跨区表_快吧游戏
  8. linux下php安装redis,Linux下php安装redis和phpredis库
  9. aix系统服务器限制ftp访问,AIX 限制ftp用户只能访问其主目录
  10. 强java_Java (强/弱/软/虚)引用