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