在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. 让Vs2010支持 Css3+HTML5

    第一步. 先到微软官方下载一个 Microsoft Visual Studio 2010 sp1 . 给传送门:.microsoft.com/downloads/zh-cn/details.aspx? ...

  2. 取代VS, sourceISight的IDE神器CLION

    https://www.jetbrains.com/clion/download/download-thanks.html 随时升级 http://idea.lanyus.com/ m_pRemoti ...

  3. PHP开发

    php.ini error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_CORE_WARNING & ~E_NOT ...

  4. matlab fft demo

    clf; fs=32;N=1024;   %采样频率和数据点数 n=0:N-1; t=n/fs;   %时间序列 x=1*sin(t); %信号 y=fft(x,N);    %对信号进行快速Four ...

  5. 关于"implicit declaration of function 'gettimeofday' is invalid in c99"的解决

    http://blog.csdn.net/macmini/article/details/10503799 当我们使用 gettimeofday(&time, NULL);时,会出现这样一个W ...

  6. Linux下Redis使用

    1. 简介 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. 2. 安装 安装方法如下: # yum i ...

  7. C语言中函数strcpy ,strncpy ,strlcpy的用法【转】

    转自:http://blog.chinaunix.net/uid-20797562-id-99311.html strcpy ,strncpy ,strlcpy的用法好多人已经知道利用strncpy替 ...

  8. ipv6nginx错误

    400 Bad Request The plain HTTP request was sent to HTTPS port错误参考官方文档解决方法如下: server {listen 80;liste ...

  9. 【原创】SSIS-执行包任务调用子包且子包读取父包变量

    背景: 有时候需要将一个个开发好的独立的ETL包串接起来形成一个独立而庞大的包,如:每家分公司都开发不同的ETL包,最后使用执行包任务来将这些分公司的包给串联起来形成一个独立而完整运行的ETL包,此时 ...

  10. laravel-u-editor工具栏语言切换的方法

    更改/config/app.php/locale,可支持en,zh_CN,zh_TW,我们一般设为zh_CN