SSH修改数据之后再添加出了BUG?

SSH框架项目,做到一二级专题模块的时候发现个bug,问题描述有点长,还望给点解决的思路。
流程如下,
1、点击一级专题名称f的修改按钮
图片描述

2、修改为g
图片描述
图片描述

3、此时在点击页面的添加一级专题按钮,数据都为k
图片描述
图片描述

然后返回查看,,,原来的ID为46的值被修改了???然后反复添加一级专题按钮,都是不添加,就只是修改了原来值而已。
图片描述

一开始我是这么想的:
重新部署tomcat后,先不走修改,先添加一级专题,是可以添加进去的,功能应该没什么问题.
断点了几次一开始我以为问题是出每次添加过后是不是把之前的值给覆盖了,但转念一想在添加一级专题页面中我的form表单里的action走的是关于添加内容的,没有去走修改的任何内容,然后我就单独实验了添加功能,在每次添加之前各个属性值是要为空的,而后面添加的时候是覆盖了前面的值,这里是可以添加的,就是点击了修改过后我再去加值,就加不进去变成了修改。。。。。。
图片描述

专题action


    // 添加一级专题
    public String addSubject() throws Exception {
        sub1.setSub_name(sub_name);
        sub1.setSub_introduce(sub_introduce);
        sub1.setSub_url(sub_url);
        int num = (int) subsi.execute_add(sub1);
        System.out.println("是否添加:" + num);
        if (num == 1) {
            mu = new MessageUtf8(response);
            mu.Message("添加成功");
            return "addSubjectSuccess";
        } else {
            mu.Message("添加失败");
            return "addSubjectError";
        }
    }


    /**
     * 当修改完后在添加一级专题,不会添加一级专题而是修改了之前的数据
     * 
     * @return
     * @throws IOException
     */
    // 修改一级专题
    public String updateSubject01() throws IOException {        
        sub1.setSub_name(sub_name);
        sub1.setSub_introduce(sub_introduce);
        sub1.setSub_url(sub_url);
        // 进入修改
        subsi.execute_update(sub1);
        mu = new MessageUtf8(response);
        mu.Message("修改成功");
        selectOne();// 重新调用一次查询方法
        return "updateSubject01Success";
    }

业务实现代码

/*添加部分*/
@Override
    public Object execute_add(Object obj) {
        cms_subject01 sub01 = (cms_subject01) obj;
        return addSubject(sub01);
    }
    // 添加一级专题
    public int addSubject(cms_subject01 sub1) {
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        session.merge(sub1);
        tx.commit();    
        return 1;
    }


/*修改部分*/
@Override
    public Object execute_update(Object obj) {
        cms_subject01 subject01 = (cms_subject01) obj;
        return updateSSubject01(subject01);
    }

// 修改一级专题
    public int updateSSubject01(cms_subject01 subject01) {
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        // 先获取对应id的一级标题信息
        subject01.setSub_id(subject01.getSub_id());
        List<cms_subject01> deleteSList01 = selectOneByID(subject01);
        cms_subject01 s01 = deleteSList01.get(0);// 获取list里的第一份数据
        // 修改一级专题信息
        s01.setSub_name(subject01.getSub_name());
        s01.setSub_introduce(subject01.getSub_introduce());
        s01.setSub_url(subject01.getSub_url());
        //这里出现并发问题,一个Action在两个线程中同时运行
        //session.update(s01);
        session.merge(s01);
        tx.commit();
        return 1;
    }
阅读 2.6k
2 个回答

问题解决了。
关于merge方法相当于save和update一个整合方法,报错原因就是在同一个action中有两个线程同时运行,
解决方法一:http://fuaotech.iteye.com/blo...,就是用merge方法,
但我这里反而出现了BUG,一条弧答主说的有道理
这里我的修改如下

// 添加一级专题
    public int addSubject(cms_subject01 sub1) {
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        // session.merge(sub1);
        session.save(sub1);
        tx.commit();
        // 提交完清除session并关闭
        session.clear();
        session.close();
        return 1;
    }

添加的业务方法里每次用完就清除并关闭session,当然修改方法里也可以这样改

clipboard.png

MERGE语句包含了insert和update.
如果记录存在,则执行Update操作;
如果记录不存在,则执行Insert操作.

你第一次插入 执行了insert 后面每次添加 都去找了数据库记录...执行了update
如果希望每次都插入新纪录的话,最好别用merge了....

....刚才手误 别在意 假装没发生过吧...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题