Spring整合JPA改進辦法

在標準JPA中,持久化單元默認被定義在META-INF/persistence.xml文件中,而且經過@Entity註解搜索得到。可是大多數狀況下,持久化單元不會僅僅存在一個,而且數據源也不會是一個,基於這個緣由,Spring提供了一個可選方案,即經過LocalEntityManagerFactoryBean和LocalContainerEntityManagerFactoryBean進行管理。localEntityManagerFactoryBean擴展功能太少,這個不說,咱們以LocalContainerEntityManagerFactoryBean爲例。 java

咱們的通常作法是: spring

  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工廠類知道咱們當初配置的實體在哪裏。 dom

能夠這樣: spa

  1. 刪除META-INF/persistence.xml配置文件
  2. 聲明packagesToScan屬性
  3. 聲明jpaPropertyMap屬性

最終配置以下: hibernate

<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自動管理工廠,這樣即便數據源再多也不怕出現衝突。 code

相關文章
相關標籤/搜索