Spring整合Hibernate

来源:互联网 发布:js字符串函数表 编辑:程序博客网 时间:2024/06/04 23:29

Spring整合Hibernate

Spring整合Hibernate整合什么?

  • 由IoC容器来管理Hibernate的SessionFactory
  • 让Hibernate使用上Spring的声明式事务

整合步骤:
1.加入Hibernate
添加的有Hibernate的jar包,c3p0的jar包和mysql的驱动
添加Hibernate的配置文件hibernate.cfg.xml

    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration>    <session-factory>            <!-- 配置hibernate的基本属性 -->            <!-- 1.数据源需配置到IoC容器中,所以在此处不需要配置数据源 -->            <!-- 2.关联的.hbm.xml 也在IoC容器配置SessionFactory实例时进行配置 -->            <!-- 3.配置hibernate的基本属性:方言,SQL 显示及格式化,生成数据表的策略,二级缓存 -->            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>            <property name="hibernate.show_sql">true</property>            <property name="hibernate.format_sql">true</property>            <property name="hibernate.hbm2ddl.auto">update</property>            <!-- 配置hibernate 二级缓存相关 -->    </session-factory></hibernate-configuration>

创建持久化类,并创建对应的hbm.xml映射文件

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2016-8-22 15:53:26 by Hibernate Tools 3.5.0.Final --><hibernate-mapping>    <class name="hibernate.entities.Account" table="SH_ACCOUNT">        <id name="id" type="java.lang.Integer">            <column name="ID" />            <generator class="native" />        </id>        <property name="username" type="java.lang.String">            <column name="USERNAME" />        </property>        <property name="balance" type="int">            <column name="BALANCE" />        </property>    </class></hibernate-mapping>

2.加入Spring
加入Spring的jar包
加入Spring的配置文件
配置数据库,导入资源文件
创建db.properties

jdbc.user=rootjdbc.password=jdbc.driverClass=com.mysql.jdbc.Driverjdbc.jdbcUrl=jdbc:mysql://127.0.0.1:3306/testjdbc.initPoolSize=5jdbc.maxPoolSize=10

applicationContext.xml中导入,这里需要导入context命名空间

<!-- 配置数据源 --><!-- 导入资源文件 --><context:property-placeholder location="classpath:db.properties"/><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>

配置Hibernate 的SessionFactory 实例,通过Spring提供的LocalSessionFactoryBean进行配置

<!-- 配置Hibernate 的SessionFactory 实例 --><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>    <!-- 配置hibernate映射文件的位置和名称,可以使用通配符 -->    <property name="mappingLocations" value="classpath:spring/hibernate/entities/*.hbm.xml"></property></bean>

配置Spring的声明式事务,导入tx、aop命名空间。

<!-- 配置Spring的声明式事务 --><!--  1.配置管理器--><bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"></bean><!--  2.配置事务属性 --><tx:advice id="txAdvice" transaction-manager="transactionManager">    <tx:attributes>        <tx:method name="get*" read-only="true"/>        <tx:method name="*"/>    </tx:attributes></tx:advice><!--  3.配置事务切点,并把切点和事务属性关联起来--><aop:config>    <aop:pointcut expression="execution(* hibernate.service.*.*(..))" id="txPointCut"/>    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/></aop:config>

在DAO层中使用Hibernate

不推荐使用HibernateTemplateHibernateDaoSupport, 因为只支持hibernate3,而且这个类是Spring中的,导致DAO和Spring的API耦合,可移植性变差。

直接使用SessionFactory,如下:

private SessionFactory sessionFactory;public void setSessionFactory(SessionFactory sessionFactory) {    this.sessionFactory = sessionFactory;}//获取和当前线程绑定的sessionprivate Session getSession() {    return sessionFactory.getCurrentSession();}/** * DAO保存商品的方法 * @param product */public void save(Product product) {    System.out.println("DAO save()");    getSession().save(product);}

补充

另一种方式,不使用hibernate.cfg.xml文件
不带有hibernate配置文件的配置信息,即不需要hibernate.cfg.xml文件的配置方式

    <!-- 引入外部的属性文件 --><context:property-placeholder location="classpath:jdbc.properties"/><!-- 配置连接池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">    <property name="driverClass" value="${jdbc.driverClass}"></property>    <property name="jdbcUrl" value="${jdbc.url}"></property>    <property name="user" value="${jdbc.username}"></property>    <property name="password" value="${jdbc.password}"></property></bean><!-- 配置Hibernate的相关属性 --><bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">    <!-- 注入连接池 -->    <property name="dataSource" ref="dataSource"></property>    <!-- 配置Hibernate的属性 -->    <property name="hibernateProperties">        <props>            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</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="mappingResources">        <list>            <value>com/imooc/ssh/domain/Product.hbm.xml</value>        </list>    </property></bean>
0 0