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方法返回EntityManagerFactoryEntityManagerFactory用来创建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)

这里涉及到FactoryBeanBeanFactory 的区别参考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的要求,

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现Spring与Struts2的整合: 1. 引入Struts2的Spring插件,可在pom.xml文件添加以下依赖: ```xml <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.x.x</version> </dependency> ``` 2. 在struts.xml配置文件配置Spring的上下文,可在文件添加以下代码: ```xml <bean id="yourBeanName" class="your.package.YourClass"/> ``` 3. 在Spring的配置文件(一般为applicationContext.xml)配置Struts2所需的bean,可在文件添加以下代码: ```xml <bean id="yourActionName" class="your.package.YourAction"> <property name="property1" value="yourValue1" /> <property name="property2" value="yourValue2" /> </bean> ``` 其,YourAction为Struts2的Action类,property1和property2为Action类的属性。 实现Spring与Hibernate的整合: 1. 引入Hibernate和Spring的相关依赖,可在pom.xml文件添加以下依赖: ```xml <!-- Hibernate --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.x.x.Final</version> </dependency> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>5.x.x.RELEASE</version> </dependency> ``` 2. 在Spring的配置文件(一般为applicationContext.xml)配置Hibernate的SessionFactory,可在文件添加以下代码: ```xml <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="packagesToScan" value="your.package" /> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> </props> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> ``` 其,your.package为Hibernate映射实体类所在的包名。 3. 在Spring的配置文件配置Hibernate的映射文件,可在文件添加以下代码: ```xml <mapping class="your.package.YourEntity"/> ``` 其,YourEntity为Hibernate映射实体类。 4. 在DAO类注入SessionFactory,可在类添加以下代码: ```java @Autowired private SessionFactory sessionFactory; ``` 5. 在Service类注入DAO类,可在类添加以下代码: ```java @Autowired private YourDAO yourDAO; ``` 6. 在Controller注入Service类,可在类添加以下代码: ```java @Autowired private YourService yourService; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值