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的要求,

Spring 中的 LocalSessionFactoryBean和LocalContainerEntityManagerFactoryBean的更多相关文章

  1. 关于Spring中配置LocalSessionFactoryBean来生成SessionFactory

    转载http://m.blog.csdn.net/blog/SpbDev/8545372     学习Spring的过程中,一直不理解为何配置的bean的class是LocalSessionFacto ...

  2. Spring中文文档

    前一段时间翻译了Jetty的一部分文档,感觉对阅读英文没有大的提高(*^-^*),毕竟Jetty的受众面还是比较小的,而且翻译过程中发现Jetty的文档写的不是很好,所以呢翻译的兴趣慢慢就不大了,只能 ...

  3. 使用spring提供的LocalSessionFactoryBean来得到SessionFactory

    一直不明白,spring为什么可以通过注入LocalSessionFactoryBean的bean名称来得到SessionFactory,起初以为LocalSessionFactoryBean必然是S ...

  4. Spring中@Transactional用法深度分析

    引言: 在Spring中@Transactional提供一种控制事务管理的快捷手段,但是很多人都只是@Transactional简单使用,并未深入了解,其各个配置项的使用方法,本文将深入讲解各个配置项 ...

  5. Spring中的事务管理详解

    在这里主要介绍Spring对事务管理的一些理论知识,实战方面参考上一篇博文: http://www.cnblogs.com/longshiyVip/p/5061547.html 1. 事务简介: 事务 ...

  6. spring中基础核心接口总结

    spring中基础核心接口总结理解这几个接口,及其实现类就可以快速了解spring,具体的用法参考其他spring资料 1.BeanFactory最基础最核心的接口重要的实现类有:XmlBeanFac ...

  7. Spring中的FactoryBean

    从SessionFactory说起: 在使用SSH集成开发的时候,我们有时候会在applicationContext.xml中配置Hibernate的信息,以下是配置SessionFactory的一段 ...

  8. Spring中@Transactional用法

    作者:bladestone 来源:CSDN 原文:https://blog.csdn.net/blueheart20/article/details/44654007 版权声明:本文为博主原创文章,转 ...

  9. Spring中的c3p0配置

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/51162560 今天,我们就来详细谈谈Spring中的c3p0配置问题,好了,不耽搁 ...

随机推荐

  1. bzoj 4573 大森林

    bzoj 4573 大森林 由于树上路径是唯一的,查询合法的两个点间路径长度显然与其他加点操作无关,所以可以离线处理,将所有的查询放在加点后. 这样我们可以对每棵树都在上颗树的基础上处理好形态后,处理 ...

  2. java面试题08

    1.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? short s1 = 1; s1 = s1 + 1;编译时错误.对于shor ...

  3. RSA 每次公钥加密不同结果

    今天服务器端一哥们突然跑过来跟我说:我发现公钥每次加密都不同结果啊? 我说:怎么可能?不同的话,私要怎么解密和验证啊? 然后我屁颠屁颠的试了下,结果发现不论在在线RSA的还是自己公司 利用同一个明文加 ...

  4. ballerina 学习六 xml && json

    ballerina xml && json 参考使用 代码比较简单,使用起来还是比较方便的 xml 代码说明: import ballerina/io; function main ( ...

  5. 当Ucenter和应用通信失败,DZ数据库备份恢复

    http://blog.sina.com.cn/s/blog_775f158f010135uz.html ucenter整合自己的项目 http://jingyan.baidu.com/article ...

  6. 国外牛人的五个Kubernetes学习建议

    现在云中存在的许多系统都是建立在基于虚拟机,虚拟磁盘等物理概念的抽象基础之上的,”Heptio的联合创始人兼首席技术官兼Kubernetes在Google的原始开发人员之一的Joe Beda说. “K ...

  7. PHP与理在事先

    编程语言的应用选择,大家有各种各样的看法.高级语言有C,C++,C#,面向对象语言的典型代表Java是从信息电器发展的,因此有它的优势,也有它的局限.新编程语言族则有PHP,Ruby,Python,R ...

  8. ecmall2.3.0 前后台样式等无效,导致前台页面显示不正常问题解决

    问题一:按照安装手册安装及数据初始化后,前后台中文均出现乱码 解决方法:在upload/index.php 和 upload/admin/index.php 头上加上header("Cont ...

  9. 洛谷1527(bzoj2738)矩阵乘法——二维树状数组+整体二分

    题目:https://www.luogu.org/problemnew/show/P1527 不难想到(?)可以用二维树状数组.但维护什么?怎么查询是难点. 因为求第k小,可以考虑记权值树状数组,把比 ...

  10. Arduino+A4988驱动两相四线步进电机

    先吐槽一下,在某宝买东西这么多年碰到的不靠谱的卖家也没这几天多.丝杆发短,42电机只有32大,碳杆上的鱼眼粘的没法再歪了还死紧……所以组装还得几天.于是先玩了一下DC-DC降压模块和A4988,规划了 ...