在标准JPA中,持久化单元默认被定义在META-INF/persistence.xml文件中,并且通过@Entity注解搜索获得。但是大多数情况下,持久化单元不会仅仅存在一个,并且数据源也不会是一个,基于这个原因,Spring提供了一个可选方案,即通过LocalEntityManagerFactoryBean和LocalContainerEntityManagerFactoryBean进行管理。localEntityManagerFactoryBean扩展功能太少,这个不说,我们以LocalContainerEntityManagerFactoryBean为例。
我们的一般做法是:
- 创建persistence.xml文件
- 配置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工厂类知道我们当初配置的实体在哪里。
可以这样:
- 删除META-INF/persistence.xml配置文件
- 声明packagesToScan属性
- 声明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自动管理工厂,这样即使数据源再多也不怕出现冲突。
时间: 2024-11-15 07:33:24