首页 > 代码库 > Spring整合JPA改进办法

Spring整合JPA改进办法

在标准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=http://www.mamicode.com/"update" />> 

然后再在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=http://www.mamicode.com/"update"/>> 

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



Spring整合JPA改进办法