Spring学习笔记5,HibernateTemplate简单测试使用

本文档介绍了如何在Spring中使用HibernateTemplate进行简单的数据库操作,并着重讲解了事务控制的相关内容。从理解事务的重要性,到配置Spring事务管理,以及解决在测试过程中遇到的只读模式问题,提供了一步步的解决方案和配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

了解事务

我们一般说的事务是来源于关系数据库,当有数据持久化需求时一般都需要事务控制。

关系数据库:支持事务控制,mysql数据库存储引擎为InnoDB支持事务,存储引擎为MyIsam不支持事务。
jdbc:支持事务控制,设置CommitAuto(false)
Hibernate:支持事务,使用session.beginTransaction(),再session.getTransaction().commit()提交事务
spring如果控制事务:由于使用hibernate,spring对Hibernate中session进行管理,支持事务。

HibenateTemplate

spring针对持久层框架提供了模板类封装数据库操作方法:
1、可以简化数据访问的开发
2、支持事务控制,spring对Hibernate中session进行管理

spring提供了很多模板:
1、JdbcTemplate,针对jdbc操作数据库模板,相当于DbUtil
2、HibernateTemplate,针对Hibernate操作数据库模板。

加入jar

spring-orm-4.2.4.RELEASE.jar:spring针对orm框架整合包
spring-tx-4.2.4.RELEASE.jar:spring提供事务管理的包
spring-jdbc-4.2.4.RELEASE.jar:spring提供jdbc操作方法包,此包为事务控制的基础包

测试HibenateTemplate

dao实现类继承HibenrateDaoSupport(选择hibernate对应版本)

public class CustomerTestDaoImpl extends HibernateDaoSupport implements CustomerTestDao {

    @Override
    public CstCustomer findCustomerById(Long custId) {
        return this.getHibernateTemplate().get(CstCustomer.class, custId);
    }

    @Override
    public void insert(CstCustomer cstCustomer) {
        this.getHibernateTemplate().save(cstCustomer);
    }

}

这里写图片描述

直接运行报错:
‘sessionFactory’ or ‘hibernateTemplate’ is required
由于dao继承HibernateDaoSupport运行需要‘sessionFactory’‘hibernateTemplate’

解决:
将’sessionFactory’ or ‘hibernateTemplate’注入到dao中。

<!-- 加载db.properties配置文件 -->
         <context:property-placeholder location="classpath:db.properties"/>
         <!--  -->
         <bean id="customerTestDao" class="cn.itcast.crm.dao.impl.CustomerTestDaoImpl">
            <property name="hibernateTemplate" ref="hibernateTemplate"/>
         </bean>

         <!-- hibernateTemplate,依赖了sessionFactory -->
         <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
            <property name="sessionFactory" ref="sessionFactory"></property>
         </bean>
         <!-- 配置 sessionFactory,依赖dataSource数据源(数据库连接池)-->
         <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
                <!-- 数据源 -->
                <property name="dataSource" ref="dataSource"/>
         </bean>

         <!-- spring对  数据源进行管理 -->
         <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <!-- mysql的驱动包 -->
                <property name="driverClass" value="${jdbc.driver}" />
                <!-- 连接数据库url -->
                <property name="jdbcUrl" value="${jdbc.url}" />
                <property name="user" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
         </bean>

db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/crm_spring
jdbc.username=root
jdbc.password=123456

运行报错
Unable to locate persister: cn.itcast.crm.domain.CstCustomer
CstCustomer不是一个被hibenate管理的实体类型。

解决:
在创建SessionFacotry时候加载Hibenate 映射文件:

这里写图片描述

注意:hibernate.cfg.xml中不用配置数据库连接参数,因为spring管理数据源。

最终applicationContext配置:
<!-- 加载db.properties配置文件 -->
         <context:property-placeholder location="classpath:db.properties"/>
         <!--  -->
         <bean id="customerTestDao" class="cn.itcast.crm.dao.impl.CustomerTestDaoImpl">
            <property name="sessionFactory" ref="sessionFactory"/>
         </bean>

         <!-- hibernateTemplate,依赖了sessionFactory -->
         <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
            <property name="sessionFactory" ref="sessionFactory"></property>
            <!-- 没有整合spring进行事务控制,先不让它检查session刷新 数据的模式,如果spring进行事务控制了,此配置可以去掉了 -->
            <property name="checkWriteOperations" value="false"/>
         </bean>
         <!-- 配置 sessionFactory,依赖dataSource数据源(数据库连接池)-->
         <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
                <!-- 数据源 -->
                <property name="dataSource" ref="dataSource"/>
                <!-- 加载hibernate的映射文件 -->
                <property name="configLocations" value="classpath:hibernate/hibernate.cfg.xml"/>
         </bean>

         <!-- spring对  数据源进行管理 -->
         <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <!-- mysql的驱动包 -->
                <property name="driverClass" value="${jdbc.driver}" />
                <!-- 连接数据库url -->
                <property name="jdbcUrl" value="${jdbc.url}" />
                <property name="user" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
         </bean>

测试
1.测试查询
    private ApplicationContext applicationContext;
    @Before
    public void setUp(){
        applicationContext = new ClassPathXmlApplicationContext("bean.xml");
    }
    //测试HibernateTemplate查询方法
    @Test
    public void test1() {
        CustomerTestDao customerTestDao = (CustomerTestDao) applicationContext.getBean("customerTestDao");
        CstCustomer customer = customerTestDao.findCustomerById(97l);
        //System.out.println(customer);
    }

可查,运行成功

2.测试插入
    //测试HibernateTemplate插入方法
    @Test
    public void test2() {
        CustomerTestDao customerTestDao = (CustomerTestDao) applicationContext.getBean("customerTestDao");
        CstCustomer customer = new CstCustomer();
        customer.setCustName("詹姆斯");
        customerTestDao.insert(customer);
        System.out.println(customer);
    }

运行报错:
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove ‘readOnly’ marker from transaction definition.

原因:
1、当前事务控制没有交给spring托管,spring进行事务控制,session刷新数据的模式为只读。
2、要使用HibernateTemplate,继承HibernateDaoSupport,HibernateTemplate方法中对插入操作、更新操作、删除操作默认使用事务控制。HibernateTemplate类检查session的刷新数据的模式,如果为只读的报错。

解决方案:
1、spring进行事务控制
2、HibernateTemplate不检查session的刷新数据的模式(当前先使用此方式)
这里写图片描述


小结

由于dao继承HibernateDaoSupport运行需
要’sessionFactory’或’hibernateTemplate’,
解决方案:
1、向dao注入’hibernateTemplate’
2、向dao注入’sessionFactory’

建议注入’hibernateTemplate’,灵活配置’hibernateTemplate’属性值。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值