2014-10-30 2 views
1

Я пытаюсь создать простую регистрацию сервлета с использованием шаблона DAO, возникает исключение, когда я пытаюсь добавить данные в базу данных. Кажется, что ID не получает значение по какой-то причине, но почему?java.sql.SQLIntegrityConstraintViolationException Servlet

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(); 
    } 
} 

Вызов метода дао в классе сервлета:

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

Похоже, вам нужно создать столбец ID как столбец IDENTITY и вставить нуль в своем заявлении:

Идентичность автоинкрементируемого Колонки

Каждая таблица может содержать один столбец автоинкрементируемого, известный как столбец IDENTITY . Столбец IDENTITY всегда рассматривается как первичный ключ для таблицы (в результате, первичные ключи с несколькими столбцами не могут быть , если имеется столбец IDENTITY). Поддержка была добавлена ​​для CREATE TABLE (IDENTITY, ...) в качестве ярлыка.

Начиная с версии 1.7.2, стандартный синтаксис SQL используется по умолчанию, что позволяет указать начальное значение. Поддерживаемая форма: ( INTEGER, ПОЛУЧЕННЫЙ ПО УМОЛЧАНИЮ КАК ИДЕНТИФИКАЦИЯ (НАЧАЛО С n, [ИНКРЕМЕНТ ПО м]) ПЕРВИЧНЫЙ КЛЮЧ, ...). Также добавлена ​​поддержка для идентификаторов BIGINT . В результате столбец IDENTITY представляет собой столбец BIGINT INTEGER или с его значением по умолчанию, генерируемым генератором последовательности .

Когда вы добавляете новую строку в такую ​​таблицу, используя INSERT INTO ...; вы можете использовать значение NULL для столбца IDENTITY , что приводит к автоматически генерируемому значению для столбца . Функция IDENTITY() возвращает последнее значение, вставленное в в любой столбец IDENTITY этим соединением. Используйте CALL IDENTITY(); в качестве оператора SQL для получения этого значения. Если вы хотите использовать значение для поля в дочерней таблице, вы можете использовать INSERT INTO VALUES (..., IDENTITY(), ...) ;. Оба типа вызовов для IDENTITY() должны быть сделаны до того, как в базу данныхбудут выпущены любые дополнительные обновления или вставки.

Следующее значение IDENTITY для использования может быть установлен с

ALTER TABLE ALTER COLUMN ПЕРЕЗАПУСТИТЬ С;

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

0

В соответствии с CREATE SEQUENCE Seq1 как целочисленные начать с 1;

pst = getConnection(). PrepareStatement ("вставить в клиента (имя_пользователя, фамилия, код)" + "значения (?,?,?) ");

Должно быть:.

пст = GetConnection() prepareStatement ("? Вставить клиента (first_name, фамилия, код) " +" значения (NEXT VALUE FOR Seq1,, ?) ");

Смежные вопросы