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

??

在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种方法都測试通过。

时间: 2024-12-08 16:54:57

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

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

在Spring 集成 Hibernate 的JPA方式中,需要在persistence配置文件中定义每一个实体类,这样非常地不方便,2种方法可以解决此问题: 这2种方式都可以实现不用在persistence.xml文件中配置每一个实体类,从而免去每个Entity都要在persistence.xml文件中配置的烦恼,但是这种方式Entity实体类的主键字段注解@ID要放到 getXXX()方法上,否则不认. 方式1: 修改“LocalContainerEntityManagerFactoryBea

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

原文:JPA 不在 persistence.xml 文件中配置每个Entity实体类的2种解决办法 在Spring 集成 Hibernate 的JPA方式中,需要在persistence配置文件中定义每一个实体类,这样非常地不方便,远哥目前找到了2种方法. 这2种方式都可以实现不用persistence.xml文件,免去每个Entity都要在persistence.xml文件中配置的烦恼,但是这种方式Entity实体类的主键字段注解@ID要放到 getXXX()方法上,否则不认. 方式1: 修改

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

加入自己定义控件可能有两种不同的情况: 1.  在duilib库中加入的自己定义控件. 2.  在我们的应用程序中自己重写了一个控件. 以下開始解说不同的情况下怎么才干支持在xml文件配置控件: 1.  库中情况 假如自己定义的控件是CGifUI类. 库中情况相对是比較简单的,仅仅需在分析xml文件时候将控件创建出来即可了,所以我找到的函数是CControlUI* CDialogBuilder::_Parse(CMarkupNode* pRoot, CControlUI* pParent, CP

Maven中pom.xml文件的配置

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd "> <!-- 父项目的坐标.如

JPA持久化persistence.xml配置文件即参数详解

Java Persistence API:持久性单元(Persistence Units) 如果你打算在你的应用中使用JPA,你就需要使用持久性单元(Persistence Units).持久性单元具有唯一的名称,负责定义应用中的一组实体如何进行管理和持久性.在应用中使用persistence.xml文件来设置持久性单元,可以配置多个持久性单元,但每个单元拥有唯一的名称. 持久性单元包含的属性有: 在该持久性单元范围(作用域)内的实体类 为上述实体类提供持久性的持久性提供者(Persistenc

阿里面试题:Mybatis中的Dao接口和XML文件里的SQL是如何建立关系的?

一.解析XML首先,Mybatis在初始化SqlSessionFactoryBean的时候,找到mapperLocations路径去解析里面所有的XML文件,这里我们重点关注两部分.1.创建SqlSourceMybatis会把每个SQL标签封装成SqlSource对象.然后根据SQL语句的不同,又分为动态SQL和静态SQL.其中,静态SQL包含一段String类型的sql语句:而动态SQL则是由一个个SqlNode组成. 假如我们有这样一个SQL: <select id="getUserB

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

写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean Definition到底是什么,咱们对着接口,逐个方法讲解 曹工说Spring Boot源码(3)-- 手动注册Bean Definition不比游戏好玩吗,我们来试一下 曹工说Spring Boot源码(4)-- 我是怎么自定义ApplicationContext,从json文件读取bean de

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

写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean Definition到底是什么,咱们对着接口,逐个方法讲解 曹工说Spring Boot源码(3)-- 手动注册Bean Definition不比游戏好玩吗,我们来试一下 曹工说Spring Boot源码(4)-- 我是怎么自定义ApplicationContext,从json文件读取bean de

Hibernate中一对多关联的时候hbm.xml文件的配置

body { font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bold; } h3 { fon