2013-12-13 11 views
2

Я широко осматривал эту ошибку на форумах Google/MyBatis, но не смог найти окончательного ответа. Я таблица определена, как показано ниже:org.postgresql.util.PSQLException: ОШИБКА: значение null в столбце «id» нарушает непустое ограничение

CREATE TABLE "user" 
(
id integer NOT NULL DEFAULT nextval('user_userid_seq'::regclass), 
username character varying(256) NOT NULL, 
first_name character varying(128), 
last_name character varying(128), 
id_number character varying(32), 
id_type integer, 
email_verified boolean, 
cellphone_verified boolean, 
token character varying(256), 
CONSTRAINT pk_id PRIMARY KEY (id), 
CONSTRAINT unique_user_username UNIQUE (username) 
) 
WITH (
OIDS=FALSE 
); 

user_userid_seq определяется как:

 CREATE SEQUENCE user_userid_seq 
    INCREMENT 1 
    MINVALUE 1 
    MAXVALUE 9223372036854775807 
    START 1 
    CACHE 1; 

Я использую MyBatis генератор для генерирования MapperXML и других классов. Однако, когда я пытаюсь вставить запись с помощью автогенерируемой картографа, я получаю следующее сообщение об ошибке:

Error updating database. Cause: org.postgresql.util.PSQLException: 
    ERROR: null value in column "id" violates not-null constraint 
    Detail: Failing row contains (null, [email protected], Edwin, Eliot, 98098098, 1, f, null, null). 
    The error may involve com.dukstra.xxx.web.data.mapper.UserMapper.insert-Inline 
    The error occurred while setting parameters 
    SQL: insert into public.user (id, username, first_name, last_name, id_number, id_type, email_verified, cellphone_verified, token) values (?, ?, ?, ?, ?, ?, ?, ?, ?) 
    Cause: org.postgresql.util.PSQLException: 
    ERROR: null value in column "id" violates not-null constraint 
    Detail: Failing row contains (null, [email protected], Edwin, Eliot, 98098098, 1, f, null, null). 

Кажется, что при вызове mapper.insert (NEWUSER); Столбец id передается как null, что приводит к ошибке выше. Каков наилучший способ исправить это? Я нашел несколько работ вокруг, но не уверен, есть ли окончательный способ? Некоторые решения предложили указать явный selectKey и тип установки на «pre» с опцией «createdKey». Однако это означало бы необходимость писать/настраивать xml для каждой таблицы с автоматически сгенерированным первичным ключом с последовательностью. Есть ли более простой способ либо сообщить Postgres автоматически использовать ключ по умолчанию, если значение равно null или, возможно, разрешить значение «DEFAULT» (String) в поле ID генерируемого объекта пользователя? Каков наилучший способ справиться с этим?

UPDATE: вот генератор конфигурация:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE configuration 
      PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
      "http://mybatis.org/dtd/mybatis-3-config.dtd"> 
    <configuration> 
    <settings> 
    <setting name="useGeneratedKeys" value="true" /> 
    </settings> 
    <environments default="development"> 
    <environment id="development"> 
     <transactionManager type="JDBC" /> 
     <dataSource type="POOLED"> 
      <property name="driver" value="org.postgresql.Driver" /> 
      <property name="url" value="jdbc:postgresql://localhost:5433/travelnet" /> 
      <property name="username" value="postgres" /> 
      <property name="password" value="*******" /> 

     </dataSource> 
    </environment> 
</environments> 

<mappers> 
    <package name="com.dukstra.travelnet.web.data.mapper" /> 

</mappers> 

+1

Значение по умолчанию применяется только в том случае, если значение NO указано во вставке. Предоставление любого значения, даже null, пытается вставить это значение. –

+0

Каково значение параметра конфигурации 'useGeneratedKeys'? –

ответ

2

Я думаю, что лучший способ не пропустить колонну идентификатора вниз к БД при выполнении вставки. Новые записи получат значения id из последовательности, которая у вас есть. Как именно вы можете достичь этого с помощью этих конкретных технологий, которые вы используете, я не уверен, поскольку у меня нет опыта с ними. Возможно, вы можете сделать это через MapperXML или через некоторые аннотации в классах сущностей, которые у вас есть.

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