首先我有三个表 现在的问题只涉及两个表
第一个表:
create table users(
id number(8) primary key, 
username varchar(15) unique not null,
password varchar(16) not null, 
roleid number(4) unique not null, 
CONSTRAINT users_roleid_fk FOREIGN KEY(roleid) REFERENCES role(roleid) ON DELETE CASCADE
);
第二个表:
create table datas(
id number(8), 
email varchar(30) unique not null, 
school varchar(30), 
city varchar(16), 
age number(4) check(age between 0 and 200), 
sex varchar(4) check(sex in('男','女')), 
birthday date, 
qq number(20), 
telephone varchar(20), 
CONSTRAINT datas_id_fk FOREIGN KEY(id) REFERENCES users(id) ON DELETE CASCADE
);
还有一个sequence:
create sequence Counter minvalue 1 nomaxvalue start with 1 increment by 1 nocache;我有一个JDBC java文件,比较长 目前就拿出两个方法 都是添加数据的方法:问题就在此(UserInformation是我的信息封装类,所有信息封装在这个java文件里)
public void addUsers(UserInformation user){

//编写一个添加数据sql语句
String sql = "insert into users values(" + "Counter.Nextval" + ",'" + user.getUsername() + "','" + user.getPassword() + "'," + user.getRoleid() + ")";
try{
int i = stm.executeUpdate(sql);
System.out.println("-----add user-------->" + i) ;
this.conn.commit();
}catch(SQLException e){
e.printStackTrace();
} }
public void addDatas(UserInformation user){

String sql = "insert into datas values(" + "Counter.CURRVAL" + ",'" + user.getEmail() + "','" + user.getSchool() + "','" + user.getCity() + "'," + user.getAge() + ",'" + user.getSex() + "',to_date('" + user.getBirthday() + "','yyyy-mm-dd')," + user.getQq() + "," + user.getTelephone() + ")";
System.out.println("addDatas()---sql---->" + sql) ;
try {
stm.executeUpdate(sql);
this.conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
jsp程序就不拿出来了:没什么程序下面是我的servlet文件:只拿出doPost部分
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

UserInformation user = new UserInformation();
user.setUsername(request.getParameter("register_username"));
user.setPassword(request.getParameter("register_password"));
user.setEmail(request.getParameter("register_email"));
user.setSchool(new String(request.getParameter("register_school").getBytes("ISO8859-1"),"GBK"));
user.setCity(new String(request.getParameter("register_school").getBytes("ISO8859-1"),"GBK"));
user.setAge(Integer.parseInt(request.getParameter("register_age")));
user.setSex(new String(request.getParameter("register_sex").getBytes("ISO8859-1"),"GBK"));
user.setBirthday(request.getParameter("register_birthday"));
user.setQq(Integer.parseInt(request.getParameter("register_qq")));
user.setTelephone(request.getParameter("register_telephone"));
user.setRoleid(Integer.parseInt(request.getParameter("register_roleid")));

MyJdbc jdbc = new MyJdbc();
jdbc.addUsers(user);
MyJdbc jdbc1 = new MyJdbc();
jdbc1.addDatas(user);

HttpSession session = request.getSession();
session.setAttribute("username_register", user.getUsername());
request.getRequestDispatcher("myjsptest/register_success.jsp").forward(request, response);
}每次添加的时候 都会出错 提示的意思就是我主表(users)中没有东西 所以外键表(datas)无法添加但是我在dos下select users表 里面有数据 datas中就没有数据  肯定不是数据类型 格式的问题请各位高手讲下 是不是两次添加之间要有间隔?
还有就是 是不是公司中 不用这个方法添加?有什么好方法吗?

解决方案 »

  1.   

    太长了,只看了下错误每次添加的时候 都会出错 提示的意思就是我主表(users)中没有东西 所以外键表(datas)无法添加这表示要插主表再插外键
    或者是你用到了事务插主表好没提交就开始插外键
      

  2.   

    你的方式错误。因为id在这两张表里面是同一个值才对。但你的两条sql语句里面都用的是Counter.CURRVAL,这肯定导致两个id数据不一样:单线程的情况下,在插入user表之后,datas表的id肯定比suer表大1,相邻的两个id其实是一个user;多线程,则这两个id的值会乱串,即相邻的两个值不代表同一个user。
    你需要修改你的程序:
    从建表语句来看,user的username是unique的,你可以考虑执行完user的插入后,把user表的对应这个username的id查出来,作为datas表的id,这样就可以了。
      

  3.   


    看错了,第二个用的是curval,所以单线程的情况应该是对的。但是多线程的情况会乱串
      

  4.   

     把 异常信息发出来啊 !  
     还有就是:  你主表数据加进去了…………  但是你字表数据的id是主键 但是也不是自动增长 !因为是主表的id ! 你把user给它去添加 它怎么知道主键id是多少呢 ……  如果是hibernate当然可以! 但是只是
     jsp+servlet+JDBC  还不能做到 真正的面向对象编程!所以你添加完主表的数据之后需要去查询获得 id号
      

  5.   

    恩恩,还要保证这个Counter不被其他地方用到。
      

  6.   

    users ,datas 这两个表是主从关系吧? 如果是这样,一定要先插入users数据才可以插入datas数据,而且两表的主键ID是一致的
      

  7.   

    请问四楼的 我一个是Nextval下一个值 一个是CURRVAL当前值
    每次插入users表数据是 sequence就会加1 而datas表中就会取当前值而已
      

  8.   

    回复9楼  我是先插入users后插入datas  而且ID是一致的
    关键是 我的先后顺序就是这样:
    MyJdbc jdbc = new MyJdbc();
    jdbc.addUsers(user);
    MyJdbc jdbc1 = new MyJdbc();
    jdbc1.addDatas(user);可能代码的先后不能完全代表电脑执行时就是这样 或者说可能是同时执行 才造成总是报错误 所以求助下高手,在执行时 底层应该是什么样的 是不是真的是因为同时执行了 才错误 应该怎么改!
      

  9.   


    MyJdbc jdbc = new MyJdbc();
    jdbc.addUsers(user);
    MyJdbc jdbc1 = new MyJdbc();
    jdbc1.addDatas(user);这种操作应该在一个事务中的,不知道LZ为什么要new2次。就目前的代码来看,单线程应该是没问题的,就是不知道你的MyJdbc中是否有其他能影响到sequence的地方
      

  10.   


    MyJdbc jdbc = new MyJdbc();
    jdbc.addUsers(user);
    MyJdbc jdbc1 = new MyJdbc();
    jdbc1.addDatas(user);
    ----->>>
    MyJdbc jdbc = new MyJdbc();
    jdbc.addUsers(user);
    jdbc.addDatas(user);
    这样试试看。总体看来,你的代码很乱。
    把con对象和sql语句混在一个类里面,而且没有看见在哪里关闭stmt和conn。
      

  11.   

    我new两次 因为new一次也是错误 所以试试两次 结果一样