Spring 中的 LocalSessionFactoryBean和LocalContainerEntityManagerFactoryBean


Spring和Hibernate整合的時候我們經常會有如下的配置代碼

1,非JPA支持的配置

<!-- 配置 Hibernate 的 SessionFactory 實例: 通過 Spring 提供的 LocalSessionFactoryBean 進行配置 -->

    <!-- FacotryBean 配置的時候返回的不是本身而是返回的FactoryBean 的 getObject()方法返回的對象,此處是sessionFactory(Hibernate的類),用來創建session 進行數據庫操作 -->

   我們配置LocalSessionFactoryBean 得到的是LocalSessionFactoryBean 的getObject方法返回SessionFactory,SessionFactory用來創建session來進行數據庫的操作

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <!-- 配置數據源屬性 -->
        <property name="dataSource" ref="dataSource"></property>
        <!-- 配置 hibernate 配置文件的位置及名稱 -->
        <!--  
        <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
        -->
        <!-- 使用 hibernateProperties 屬相來配置 Hibernate 原生的屬性 -->
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
        <!-- 配置 hibernate 映射文件的位置及名稱, 可以使用通配符 -->
        <property name="mappingLocations" 

            value="classpath:com/atguigu/spring/hibernate/entities/*.hbm.xml">

       </property>

 

 

       <!-- 配置 hibernate 實體Bean的映射,如果缺少此項內容則不會創建表,創建表的過程是在生成容器的時候同時生成表 -->

       <和上邊配置xml類型的實體bean二選一就可以了>

       <property name="annotatedClasses">
          <list>
                  <value>com.marshallee.entities.Account</value>
          </list>
        </property>

    </bean>

 

2,JPA支持的配置

同樣我們配置.LocalContainerEntityManagerFactoryBean得到的是.LocalContainerEntityManagerFactoryBean 的getObject方法返回EntityManagerFactory,EntityManagerFactory用來創建EntityManager來進行數據庫的操作

<bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
                <property name="generateDdl" value="true" />
                <property name="databasePlatform" value="${db.dialect}" />
            </bean>
        </property>
        <property name="jpaProperties">
            <props>
                <!-- base -->
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.transaction.flush_before_completion">true</prop>
                <!-- show_sql -->
                <prop key="hibernate.show_sql">false</prop>
                <!-- cache -->
                <prop key="hibernate.cache.use_query_cache">true</prop>
                <prop key="hibernate.cache.use_second_level_cache">true</prop>
                <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop>
                <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
                </prop>
            </props>
        </property>
    </bean>

 

 

“jpaVendorAdapter屬性用於指明所使用的是哪一個廠商的JPA實現。Spring提供了多個JPA廠商適配器:

EclipseLinkJpaVendorAdapter
HibernateJpaVendorAdapter
OpenJpaVendorAdapter
TopLinkJpaVendorAdapter(在Spring 3.1版本中,已經將其廢棄了)”

摘錄來自: [美] Craig Walls. “Spring實戰(第4版)”。 iBooks. 

 

只要記住一點當我們配置FactoryBean后,當調用getBean(beanName)的時候我們得到的是FactoryBean.getObject返回的對象,如果我們要得到FactoryBean本身則需要在調用getObject的時候加上引用'&' 如  getBean(&beanName)

這里涉及到FactoryBean 和BeanFactory 的區別參考:http://chenzehe.iteye.com/blog/1481476

 


容易混淆的地方

persistence.xml是JPA規范要求的,在應用程序管理類型的JPA中我們需要配置persistence.xml 中的數據源內容用PersistenceProvider來生成一個EntityManagerFactory,但是在“容器管理類型的JPA" 中 ”當運行在容器中時,可以使用容器(在我們的場景下是Spring)提供的信息來生成EntityManagerFactory。你可以將數據源信息配置在Spring應用上下文中,而不是在persistence.xml中了,盡管數據源還可以在persistence.xml中進行配置,但是這個屬性指定的數據源具有更高的優先級.

綜上可以理解為如果我們選擇在spring上下文中配置數據源信息,則不需要再persistence.xml中配置了,即使配置了在容器類型的JPA中,容器會優先選擇容器上下文中的配置信息,但是persistence,xml這個文件還是必須要有的,可以是空的配置,但必須要有,這是JPA的要求,


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM