为了账号安全,请及时绑定邮箱和手机立即绑定

hibernate交spring事物托管后插入数据无效,不发送sql语句,不报错,但能查询到数据。

hibernate交spring事物托管后插入数据无效,不发送sql语句,不报错,但能查询到数据。

隔江千里 2019-03-13 18:11:34
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&amp;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);”或其他)导致异常消息被吞掉,如果发生这样吞异常的情况,定位问题将是十分繁琐的。


查看完整回答
反对 回复 2019-04-23
  • 2 回答
  • 0 关注
  • 878 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号