文档章节

Spring整合JPA改进办法

Barudisshu
 Barudisshu
发布于 2014/09/25 16:50
字数 418
阅读 4299
收藏 12

在标准JPA中,持久化单元默认被定义在META-INF/persistence.xml文件中,并且通过@Entity注解搜索获得。但是大多数情况下,持久化单元不会仅仅存在一个,并且数据源也不会是一个,基于这个原因,Spring提供了一个可选方案,即通过LocalEntityManagerFactoryBean和LocalContainerEntityManagerFactoryBean进行管理。localEntityManagerFactoryBean扩展功能太少,这个不说,我们以LocalContainerEntityManagerFactoryBean为例。

我们的一般做法是:

  1. 创建persistence.xml文件
  2. 配置Spring上下文
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
	<persistence-unit name="hibernatePersistenceUnit" transaction-type="RESOURCE_LOCAL">
		<properties>
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
		</properties>
	</persistence-unit>
</persistence>

然后再在Spring中引入persistence.xml配置文件,

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
	p:persistenceXmlLocation="classpath*:META-INF/persistence.xml"
	p:persistenceUnitName="hibernatePersistenceUnit"
	p:dataSource-ref="jpaDataSource"
	p:jpaVendorAdapter-ref="hibernateVendor"/>
 
<bean id="hibernateVendor" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
	p:showSql="false"/>

如何改进

基于文档需求,我们希望移除persistence.xml文件,但是如何声明外部配置文件从而关联到ORM框架中呢?并且如何让EntityManagerFactory工厂类知道我们当初配置的实体在哪里。

可以这样:

  1. 删除META-INF/persistence.xml配置文件
  2. 声明packagesToScan属性
  3. 声明jpaPropertyMap属性

最终配置如下:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
	p:packagesToScan="org.krams.tutorial.domain"
	p:dataSource-ref="jpaDataSource"
	p:jpaVendorAdapter-ref="hibernateVendor"
	p:jpaPropertyMap-ref="jpaPropertyMap"/>
 
<util:map id="jpaPropertyMap">
    <entry key="hibernate.hbm2ddl.auto" value="update"/>
    <entry key="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
</util:map>
 
<bean id="hibernateVendor" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
	p:showSql="false"/>

这样做的好处是,当真正需要调用相应的实体对象时再进行数据源的配置,让Spring自动管理工厂,这样即使数据源再多也不怕出现冲突。



© 著作权归作者所有

上一篇: JavaEE 7技术一览
下一篇: JPA/EJB3 Relationship
Barudisshu
粉丝 27
博文 62
码字总数 70723
作品 0
茂名
程序员
私信 提问
spring3 ,spring3 mvc 配置文件整合问题,哪种配置更好?

正常的整合是要在web.xml里面配置spring监听器,spring mvc的dispath servlet,代码如下: Java代码 org.springframework.web.context.ContextLoaderListener contextConfigLocation /WEB-I......

_凤求凰_
2014/01/07
2.4K
3
SpringMVC+Spring4.0+Hibernate 简单的整合

学习的初始 一个 Hello World。 1、搭建好环境 工欲善其事,必先利其 这是需要的jar 简单的说下 : standard.jar 这个jar包是我们在jsp中使用JSTL标签的时候用到的。你也可以使用SpringEL 。 ...

Jeremy_pan
2014/08/30
0
13
Velocity与Spring的普通servlet 如何整合?

项目中使用了Spring,并没有使用Spring的MVC。而是采用了普通的Servlet作为借口,并通过以下代码使Servlet可以使用Spring中的bean。 现在我想整合Velocity进来 如果Servlet继承org.apache.ve...

jam_
2014/11/19
597
2
SpringFramework4系列之整合Resteasy

对于和jboss as7的集成不需要做任何工作,jboss默认集成了resteasy,只需要对业务pojo做一些jax-rs的注解标注即可。 对于非Jboss的Servlet容器 Spring和resteasy集成,主要有三种方式, 运行...

Garrry
2015/07/21
0
0
No mapping found for HTTP request with URI [/demo/WEB-INF/view/index.html] in DispatcherServlet with name 'SpringMVC'

错误:[org.springframework.web.servlet.PageNotFound] - No mapping found for HTTP request with URI [/demo/WEB-INF/view/index.html] in DispatcherServlet with name 'SpringMVC' web.......

mhi
03/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

gradle grovvy中的闭包

1. 无参数的闭包 //这b1就是一个闭包def b1={ println "hello b1"}//定义方法,包含闭包类型的参数def method1(Closure closure){closure()}//执行method1method1(b1) 执行结果 ...

edison_kwok
31分钟前
3
0
基于Spring Boot + Dubbo的全链路日志追踪(一)

一、 概要 当前公司后端整体架构为:Spring Boot + Dubbo。由于早期项目进度等原因,对日志这块没有统一的规范,基本上是每个项目自己管自己的日志。这也对后面的问题排查带来了很大的困难,...

明天以后
今天
7
0
安装fastdfs文件服务器步骤

1、安装libfastcommon wget https://github.com/happyfish100/libfastcommon/archive/master.zip 解压后安装 cd fastcommon-master ./make.sh ./make.sh install 2、安装 FastDFS,从sourcef......

lsjlgo
今天
3
0
MySQL 5.7 免安装版配置

下载地址:https://dev.mysql.com/downloads/mysql/ 安装步骤 1.下载zip解压到目录下 2.配置环境变量 新建系统变量:MYSQL_HOME,值:D:\DevelopmentTool\Mysql-5.7.26-winx64 修改path变量:...

华山猛男
今天
7
0
java map的遍历

//从大的角度可以分为两类Set<String> set=map.keySet();这里面还可以分为3类, 从set的角度来分 //Set<Map.Entry<String, String>> entery=map.entrySet(); public class Test { public sta......

南桥北木
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部