zoukankan      html  css  js  c++  java
  • 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的要求,

  • 相关阅读:
    Badboy录制脚本时,提示脚本错误解决方法
    Python数据类型_列表
    Wannafly Primary School Students训练记录
    Deadline队伍训练实录
    2018 German Collegiate Programming Contest (GCPC 18)
    2016ccpc杭州
    2016 ICPC 大连
    2017CCPC Final (哈尔滨)
    2017CCPC 长春
    2017 CCPC 杭州
  • 原文地址:https://www.cnblogs.com/onlymate/p/7568572.html
Copyright © 2011-2022 走看看