您的位置:首页 > 编程语言 > Java开发

详细解释Spring与Hibernate的整合

2016-01-13 17:38 543 查看
首先我们来看单纯的使用Hibernate时管理数据源:

在类路径下创建一个hibernate.cfg.xml

写入数据源的信息:

[code]<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的简单使用:

[code]
 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:

[code]<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类来完成

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


spring来管理事务:

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


在代码中使用:

操作将由hibernateTemplate来完成

[code]@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的注入,配置事务管理器,事务的注解解析器 等于上述一摸一样:

代码详情:

[code]<!--导入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连接池信息的时候我们使用了:

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


除了这种方法还有:

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


这两种方法都可以完成把外部properties数据导入进来.然后通过${key}来访问此properties文件中的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: