Я широко осматривал эту ошибку на форумах 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>
Значение по умолчанию применяется только в том случае, если значение NO указано во вставке. Предоставление любого значения, даже null, пытается вставить это значение. –
Каково значение параметра конфигурации 'useGeneratedKeys'? –