spring整合hibernate使用getHibernateTemplate().save()方法不能输入数据库

今天使用早就搭好的项目,试图保存用户信息的时候,使用this.getHibernateTemplate().save(user);方法之后发现并没有插入到数据库中数据。于是开始在网上找各种资料,由于并没有深入的研究过spring和hibernate的源码,所以下面的解决方法只能是 "所以",而不会是 “之所以”。
首先,先看一下单纯的hibernate是怎么保存实体对象的:
Session.save()方法用于实体对象的持久化保存,也就是说当执行session.save()方法时会生成对应的 insert SQL语句,完成数据的保存。
一个典型的saveXXXX()方法:


public void saveObject( Object obj){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction t = session.beginTransaction();
t.begin();
try{
session.save( obj);
}catch(Exception e){
e.printStackTrace();
}
t.commit();
if( session.isOpen()){
session.close();
}
}
每一次保存对象都需要得到一个session,然后保存完之后关闭session,此时会更新数据库。
而执行到session.save()方法的时候只是持久化了对象 ,并没有向数据库中插入记录。

但是在我们使用spring的 HibernateTemplate 管理hibernate的操作的时候,会发现当我们的DAO 继承了HibernateDaoSupport之后,使用this.getHibernateTemplate().save(user); 并不会向数据库中插入数据。实际上这时候只是在hibernate的session缓存中持久化了对象user,为了达到我们即时更新数据库(比如我们要做的是注册操作),我们可以这样做:
首先,在spring配置文件 applicationContext中配置 :
<!-- 声明式事务管理 -->
<bean id="proxyTemplate"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!-- 声明式事务管理 结束 -->

然后对想要使用事务管理的dao配置:
<bean id=" UserDao" class="com.kalor.dao.impl.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>

<!-- 声明式事务管理 配置DAO -->
<bean id="nameproxy"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator ">
<property name="beanNames">
<list>
<value> UserDao</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>proxyTemplate</value>
</list>
</property>
</bean>

之后只要在UserDao中将使用了getHibernateTemplate().save(user); 的方法命名为 saveXXX即可
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值