hibernate交spring事务托管后插入数据无效,不发送sql语句,不报错,但能查询到数据。如果手动执行sessionFactory.getCurrentSession().flush()可以立即写入到数据库。不手动的话无法自动事务提交。怀疑是spring事务管理没起作用。(学生党刚学框架,不妥当的地方还请明示)dao层代码:public class UserDao implements IUserDao{ private SessionFactory sessionFactory; public SessionFactory getSessionFactory() { return sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public boolean addUser(User user) { LogUtil.getLog().info("正在执行user插入操作~"); try { sessionFactory.getCurrentSession().save(user); } catch (Exception e) { LogUtil.getLog().error(e); return false; } return true; }controller层:if(code.equals(checkCode)){ if(userDao.addUser(user)){ //将用户信息加进session中 return "redirect:/returnIndex"; }else{ model.addAttribute("message", "系统异常,注册失败!"); return "forward:/user/returnRegiste"; } }else{ model.addAttribute("message", "验证码错误!"); return "forward:/user/returnRegiste"; }xml配置: <!-- c3p0数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="user"><value>root</value></property> <property name="password"><value></value></property> <property name="minPoolSize"><value>20</value></property> <property name="maxPoolSize"><value>100</value></property> <property name="initialPoolSize"><value>20</value></property> <property name="driverClass"><value>com.mysql.jdbc.Driver</value></property> <property name="jdbcUrl"><value>jdbc:mysql://localhost:3306/db_shop?useUnicode=true&characterEncoding=UTF-8</value></property> </bean>
2 回答

杨魅力
TA贡献1811条经验 获得超6个赞
1、既然用了springMVC和hibernate,为啥不用spring的hibernateTemplate呢?
2、你的spring配置文件中配置sessinFactory和transactionManager,但你的DAO中却自己从sessionFactory中获取session,而且没有相关的事物控制代码……我认为就是因为这个导致事物没有被提交。就好比你用了连接池,却自己用JDBCDriver创建了一个connection,那连接池肯定管理不了这个Connection啊,因为它都不知道有这么个连接……
最后给你一个建议:调试阶段的代码,e.printStackTrace()还是加上的好,而且最好加上throw e,这样让上游代码知道本层出了问题,否则,很可能因为人为的因素(比如忘了写“LogUtil.getLog().error(e);”或其他)导致异常消息被吞掉,如果发生这样吞异常的情况,定位问题将是十分繁琐的。
添加回答
举报
0/150
提交
取消