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

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>


隔江千里
浏览 879回答 2
2回答

杨魅力

1、既然用了springMVC和hibernate,为啥不用spring的hibernateTemplate呢?2、你的spring配置文件中配置sessinFactory和transactionManager,但你的DAO中却自己从sessionFactory中获取session,而且没有相关的事物控制代码……我认为就是因为这个导致事物没有被提交。就好比你用了连接池,却自己用JDBCDriver创建了一个connection,那连接池肯定管理不了这个Connection啊,因为它都不知道有这么个连接……最后给你一个建议:调试阶段的代码,e.printStackTrace()还是加上的好,而且最好加上throw e,这样让上游代码知道本层出了问题,否则,很可能因为人为的因素(比如忘了写“LogUtil.getLog().error(e);”或其他)导致异常消息被吞掉,如果发生这样吞异常的情况,定位问题将是十分繁琐的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java