详细解释Spring与Hibernate的整合原理

详细解释Spring与Hibernate的整合原理spring与hibernate的整合

首先我们来看单纯的使用Hibernate时管理数据源:
在类路径下创建一个hibernate.cfg.xml
写入数据源的信息:

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">toor</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///test_hibernate_spring</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="hbm2ddl.auto">update</property>
        <!-- C3P0 连接池的配置 -->  
<property name="connection.provider_class">  
        org.hibernate.connection.C3P0ConnectionProvider  
</property>  
<property name="hibernate.c3p0.min_size">5</property>  
<property name="hibernate.c3p0.max_size">10</property>  
<property name="hibernate.c3p0.max_statements">50</property>  
<property name="hibernate.c3p0.timeout">3600</property>  
<property name="hibernate.c3p0.idle_test_period">120</property>  
<property name="hibernate.c3p0.acquire_increment">2</property>  
<!--c3p0配置结束 -->
<!-- session要从当前线程中产生-->
    <property name="current_session_context_class">thread</property>
        <mapping resource="domain/Person.hbm.xml" />
    </session-factory>
</hibernate-configuration>

如上是hibernate的最简单的数据源配置。此处不进行过多解释。
hibernate的简单使用:


 Configuration configuration = new Configuration().configure();

 SessionFactory  sessionFactory = configuration.buildSessionFactory();

sessionFactory = configuration.buildSessionFactory();
//从当前线程中(ThreadLocal)中,把session提取出来如果没有就使用openSession()
    Session session = sessionFactory.getCurrentSession();
    //hibernate的所以操作都必须在事务中
        Transaction transaction =    session.beginTransaction();
        Person p = new Person();
        p.setName("111111111111111");
        p.setDescription("2222222222222");
        session.save(p);
        transaction.commit();

如上就是hibernate的简单使用过程。现在我们来看Spring与和hibernate的整合:
spring与hibernate的整合目的就是为了让 IOC 容器来管理 Hibernate 的核心接口SessionFactory以及让 Hibernate 使用上 Spring 的声明式事务来进行事务操作.
但在Spring整合Hibernate时。处理数据源有两种方法:
1)依然使用Hibernate的hibernate.cfg.xml来写数据源信息,在spring配置文件中使用DI把这个文件注入给SessionFactory接口
2)摒弃掉hibernate.cfg.xml,而将所有的数据源配置信息写在spring的配置文件中.下面详细介绍这两种方法:

方法一:
hibernate的配置文件hibernate.cfg.xml保持如上信息不变并把hibernate.cfg.xml文件注入给spring提供的LocalSessionFactoryBean:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
   <!-- 导入hibernate配置文件-->
   <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
 </bean>      

spring中使用hibernate则不需要直接通过hinernate来完成,而是通过spring提供的HibernateTemplate类来完成

    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory">
            <ref bean="sessionFactory"/>
        </property>
    </bean>

spring来管理事务:

<!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref bean="sessionFactory"/>
        </property>
    </bean>
   <!-- 事务的注解解析器 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

在代码中使用:
操作将由hibernateTemplate来完成

@Resource(name="hibernateTemplate")
    private HibernateTemplate hibernateTemplate;
  @Transactional
    public void savePerson(){
    Person person = new Person();
    person.setUsername("666");
    person.setPassword("6666");
    hibernateTemplate.save(person);
   }

方法二:
不需要hibernate.cfg.xml来完成Spring与hibernate的整合:
此时给类LocalSessionFactoryBean注入的不是configLocation这个文件而是一个dateSource除此之外还注入数据库的方言,hbm.xml文件等信息。至于其他的如hibernateTemplate的注入,配置事务管理器,事务的注解解析器 等于上述一摸一样:
代码详情:

<!--导入c3p0的信息在次xml文件中就可以使用导入文件的信息-->
   <context:property-placeholder location="classpath:c3p0DB.properties"/>
   <!-- 配置 C3P0 数据源 -->
   <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
   <property name="user" value="${jdbc.user}"></property>
        <property name="password" value="${jdbc.password}"></property>
        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
        <property name="driverClass" value="${jdbc.driverClass}"></property>
        <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
        <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
   </bean>
   <!--注入datasource给sessionFactory以及数据库的方言和hbm.xml-->
   <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
        <!-- 导入映射文件所在的路径 -->
        <property name="mappingDirectoryLocations">
            <list>
                <value>classpath:domain  <!--加载这个路径下的所有.hbm.xml-->
                </value>
            </list>
        </property>
    <!-- Hibernate其他配置 方言 等-->
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                <prop key="hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

我们看到上述代码中在导入c3p0连接池信息的时候我们使用了:

  <context:property-placeholder location="classpath:c3p0DB.properties"/>

除了这种方法还有:

  <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
               <value>classpath:c3p0DB.properties</value>
        </property>
    </bean>

这两种方法都可以完成把外部properties数据导入进来.然后通过${key}来访问此properties文件中的值。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/36016.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注