我正在尝试使用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);
}
答案 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;
答案 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;);