java.sql.SQLIntegrityConstraintViolationException Servlet

时间:2014-10-30 18:45:57

标签: java servlets jdbc hsqldb

我正在尝试使用DAO模式创建一个简单的注册Servlet,当我尝试将数据添加到数据库时会出现异常。似乎ID因某些原因没有获得价值,但为什么呢?

integrity constraint violation: 
java.sql.SQLIntegrityConstraintViolationException NOT NULL check constraint; 
SYS_CT_10092 table: CUSTOMER column: ID

数据库架构(使用hsqldb):

CREATE SEQUENCE seq1 AS INTEGER START WITH 1;

CREATE TABLE customer (
     id BIGINT NOT NULL PRIMARY KEY,
     first_name VARCHAR(255) NOT NULL,
     surname VARCHAR(255) NOT NULL,
     code VARCHAR(255) NOT NULL,
);
INSERT INTO customer VALUES(NEXT VALUE FOR seq1,'Jane','Doe','123'); --test data

将数据插入数据库的Dao方法:

public void addCustomer(Customers c) {
    try {
        pst = getConnection().prepareStatement("insert into customer(first_name,surname,code)"
                + " values(?,?,?)");

        pst.setString(1, c.getFirst_name());
        pst.setString(2, c.getSurname());
        pst.setString(3, c.getCode());
        pst.executeUpdate();

    } catch(Exception e) {
        throw new RuntimeException(e);
    } finally {
        closeResources();
    }
} 

在servlet类中调用dao方法:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    CustomerDao dao = new CustomerDao();
    String firstname = request.getParameter("firstName");
    String lastName = request.getParameter("lastName");
    String code = request.getParameter("code");

    Customers customer = new Customers();
    customer.setFirst_name(firstname);
    customer.setSurname(lastName);
    customer.setCode(code);
    dao.addCustomer(customer);
}  

2 个答案:

答案 0 :(得分:0)

看起来您需要将id列创建为IDENTITY列并在预准备语句中插入null:

  

身份自动增量列

     

每个表都可以包含一个自动增量列,称为   IDENTITY列。 IDENTITY列始终被视为主要列   表的键(因此,多列主键不是   可能存在IDENTITY列)。已添加支持   CREATE TABLE(IDENTITY,...)作为快捷方式。

     

从1.7.2开始,默认使用SQL标准语法,允许使用   要指定的初始值。支持的形式是(   以默认为身份生成的整数(从n开始,[增加]   m])PRIMARY KEY,...)。还为BIGINT标识添加了支持   列。因此,IDENTITY列只是一个INTEGER或   BIGINT列,其序列生成的默认值   发生器。

     

使用INSERT INTO向此类表添加新行时    ...;声明,您可以使用NULL值   IDENTITY列,导致自动生成的值   柱。 IDENTITY()函数返回插入的最后一个值   此连接的任何IDENTITY列。使用CALL IDENTITY();作为一个SQL   用于检索此值的语句。如果要使用a的值   在子表中的字段,您可以使用INSERT INTO VALUES   (...,IDENTITY(),...);.必须对IDENTITY()进行两种类型的调用   在发布任何其他更新或插入语句之前   数据库中。

     

可以使用

设置要使用的下一个IDENTITY值      

ALTER TABLE ALTER COLUMN RESTART WITH;

http://hsqldb.org/doc/guide/ch02.html#N104B3

答案 1 :(得分:0)

根据CREATE SEQUENCE seq1 AS INTEGER START WITH 1;

pst = getConnection()。prepareStatement(" insert into customer(first_name,surname,code)"     +"值&#34(,?,?););

必须:

pst = getConnection()。prepareStatement(" insert into customer(first_name,surname,code)"     +"值(seq1的下一个值,?,?,?)和#34;);