环境: mysql ,window,j2se,spring想实现这样的一个事务1,保存一条记录a 到表A
2,保存一条记录b 到表B他们处在一个事务中,但问题是a的主键id是b里的一个not-null,如果在同一个事务中,执行到2的时候,其实1在数据库中也没有保存,所以也没有id的值,那么这时在执行2的时候就会出现not-null的错误?如何解决这个问题?

解决方案 »

  1.   

    你现在使用sql来插入吧?
    a表的id是自动增长的?
      

  2.   

    当然了,如果用事务也是可以的,不过就是要注意SQL语句的顺序了!例如:
    a中的cola是主键,b中的colc是主键,同时b中的cola是外键,那么插入语句应该这么写:
     start transaction;
     insert into a(cola,colb) values("test","hello"); -- 第一步必须先执行
     insert into b(colc,cola) values("mysql","test"); -- 第二步才执行这个
     commit;
      

  3.   

    to 蛋蛋: 如果a表的id是自动增长的,而不是这里手工赋值的.那应该怎么办?
     我执行完insert into a(cola,colb) values(xx,hello");(注,我是通过hibernate来插入数据)
    我去数据库中查看好象还没有这条记录.我请教过其他人,他们说如果在一个session中,这条数据已经存在了,而当commit操作的时候,这条数据才对所有session公开.现在的问题是,在一个事务中,执行完insert into a(cola,colb) values(xx,hello");后,我该如何去取得他的主键id.
      

  4.   

    问题解决了。
    谢谢大家的帮忙.
    我是这样做的。
    基于jdbc:
        public Long testTransactionInJdbc(){
            //最原始的用sql语言写的验证事务的语句
            String sql="SET AUTOCOMMIT=0; " +
                    " start transaction; "+
                    " insert into user (name) values ('roger'); "+
                    "select @userid:= @@identity; "+
                    "insert into userB (name,contactId) values ('my',@userid); "+
                    " commit ;";
                    
            //mysql 事务在jdbc中的实现
            String INSERT ="insert into user (name) values ('roger')";
            String GET="select @@identity";
            String INSERT1="insert into userB (name,contactId) values (?,?)";
            try {
                con.setAutoCommit(false);
                DelegatingStatement pst = (DelegatingStatement)con.createStatement();
                //PreparedStatement pst = (PreparedStatement)con.createStatement();
                ResultSet set=null;
                pst.execute(INSERT);
                set=pst.executeQuery(GET);
                set.absolute(1); 
                int num=set.getInt("@@identity");
                System.out.println("num="+num);
                
                PreparedStatement pst1=con.prepareStatement(INSERT1);
                pst1.setString(1,"lily");
                pst1.setShort(2, (short)num);
                //pst.execute(INSERT1);
                pst1.execute();
                
                con.commit();
            } catch (SQLException e) {
                e.printStackTrace();
                try {
                    con.rollback();
                } catch (SQLException f) {
                    f.printStackTrace();
                }
            }
            
            return null;
        }基于hibernate+spring
    UserService:
        public void saveAll(User user,UserB userB){
            userDao.saveUser(user);
            System.out.println(user.getId());
            userB.setContactId(user.getId());       
            userBDao.saveUserB(userB);
        }
    同时在xml配置saveall事务