在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.sunitjy.model.entityName" />

<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="persistenceUnitName" value="pro_persistence"></property>-->

  <property name="dataSource" ref="dataSource"></property>

  <property name="persistenceXmlLocation" value="classpath*:pro_core/jpa_persistence.xml"></property>

  <property name="packagesToScan">

   <list>

    <value>com.paic.lfex.model</value>

    <value>com.lfex.sdp.core.model</value>

    <value>com.paic.lfex.core.pro</value>

   </list>

  </property>

  <property name="jpaVendorAdapter">

   <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />

  </property>

 </bean>

persistence.xml配置文件内容:
 

<persistence 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_1_0.xsd"

 version="1.0">

 <persistence-unit name="pro_persistence"

  transaction-type="RESOURCE_LOCAL">

  <provider>org.hibernate.ejb.HibernatePersistence</provider>

   <properties>

   <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />

   <property name="current_session_context_class" value="thread" />

   <!--<property name="hibernate.hbm2ddl.auto" value="update" /> -->

   <!--<property name="hibernate.show_sql" value="true" />-->

   <!--<property name="hibernate.format_sql" value="true" />-->

  </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.3

以上2种方法都測试通过。

不在JPA 的 persistence.xml 文件里配置Entity class的解决的方法的更多相关文章

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

    在Spring 集成 Hibernate 的JPA方式中,需要在persistence配置文件中定义每一个实体类,这样非常地不方便,2种方法可以解决此问题: 这2种方式都可以实现不用在persiste ...

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

    在Spring 集成 Hibernate 的JPA方式中,需要在persistence配置文件中定义每一个实体类,这样非常地不方便,远哥目前找到了2种方法.   这2种方式都可以实现不用persist ...

  3. duilib中加入自己定义控件之后怎么可以在xml文件里配置使用

    加入自己定义控件可能有两种不同的情况: 1.  在duilib库中加入的自己定义控件. 2.  在我们的应用程序中自己重写了一个控件. 以下開始解说不同的情况下怎么才干支持在xml文件配置控件: 1. ...

  4. 160329(一)、在web.xml文件里配置org.springframework.web.context.ContextLoaderListener

    Java代码 <!-- 指明spring配置文件在何处 --> <context-param> <param-name>contextConfigLocation& ...

  5. Maven中pom.xml文件的配置

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  6. mybatis 的 dao 接口跟 xml 文件里面的 sql 是如何建立关系的?一步步解析

    序言 在开始正文之前,首先解释Dao接口和XML文件里的SQL是如何一一对应的? 一句话讲完就是:mybatis 会先解析这些xml 文件,通过 xml 文件里面的命名空间 (namespace)跟d ...

  7. 曹工说Spring Boot源码(15)-- Spring从xml文件里到底得到了什么(context:load-time-weaver 完整解析)

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  8. 曹工说Spring Boot源码(16)-- Spring从xml文件里到底得到了什么(aop:config完整解析【上】)

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  9. 曹工说Spring Boot源码(17)-- Spring从xml文件里到底得到了什么(aop:config完整解析【中】)

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

随机推荐

  1. 洛谷P2564 [SCOI2009]生日礼物

    题目背景 四川2009NOI省选 题目描述 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可 ...

  2. c#深拷贝的一个方法

    使用ef,有时候会遇到,要对一个对象进行拷贝复制,可是一般的方法,拷贝后会提示此对象的实例在上下文的 entitystate已经存在,就需要用一种拷贝.简单的拷贝只拷贝了值类型,对引用类型的拷贝需要使 ...

  3. Windows ToolTips简要介绍(转)

    原文转自 https://blog.csdn.net/sesiria/article/details/77450151 Windows 标准控件ToolTips简要介绍 参考文档 MSDN https ...

  4. Generator函数的语法

    简介 Generator函数是ES6关于异步编程的解决方案.Generator函数能够让函数暂停执行(即交出函数的执行权),简单直白点来理解,Generator函数就是一个状态机,内部封装了多个状态( ...

  5. xCode中去除“Implicit declaration of function 'sysctl' is invalid in C99” 警告

    http://blog.csdn.net/dreambegin/article/details/8609121 一般出现该问题是因为通过C调用了unix/linux 底层接口,所以需要调整c语言的编译 ...

  6. OpenGL入门学习(五)

    http://developer.178.com/201103/94955548786.html 今天要讲的是三维变换的内容,课程比较枯燥.主要是因为很多函数在单独使用时都不好描述其效果,我只好在最后 ...

  7. RxVolley报错:Caused by: java.lang.RuntimeException: RequestQueue-> DiskBasedCache cache dir error

    Caused by: java.lang.RuntimeException: RequestQueue-> DiskBasedCache cache dir error 这是因为SD卡动态权限导 ...

  8. C++ DLL导出类 知识大全

    在公司使用C++ 做开发,公司的大拿搭了一个C++的跨平台开发框架.在C++开发领域我还是个新手,有很多知识要学,比如Dll库的开发. 参考了很多这方面的资料,对DLL有一个基本全面的了解.有一个问题 ...

  9. Openstack ceilometer

    https://www.cnblogs.com/liguangsunls/p/6879879.html

  10. 2-SAT浅谈

    2-SAT浅谈 一.2-SAT问题 首先,什么是$2-SAT$问题.现在给出这样一类问题:给出$n$个点和关于这$n$个点的$m$条限制条件,并且这$n$个点中,每一个点只有两种状态.对于上述问题,我 ...