【发布时间】:2013-12-13 22:09:46
【问题描述】:
我在 Google/MyBatis 论坛上广泛查看了这个错误,但找不到明确的答案。我的表定义如下:
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, abc@gmail.com, 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, abc@gmail.com, Edwin, Eliot, 98098098, 1, f, null, null).
似乎在调用时 映射器.插入(新用户); id 列作为 null 传递,这会导致上述错误。解决此问题的最佳方法是什么?我找到了几种解决方法,但不确定是否有明确的方法?一些解决方案建议使用“generatedKey”选项指定显式 selectKey 并将类型设置为“pre”。但是,这意味着必须使用自动生成的带有序列的主键为每个表编写/自定义 xml。是否有更简单的方法来告诉 Postgres 在值为 null 时自动使用默认键,或者在生成的用户对象的 ID 字段中允许“DEFAULT”(字符串)值? 处理这个问题的最佳方法是什么?
更新:这里是生成器配置:
<?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>
【问题讨论】:
-
只有在插入时没有提供值时才应用默认值。提供任何值,甚至是 null,都会尝试插入该值。
-
配置参数
useGeneratedKeys的值是多少?
标签: java postgresql serial-port mybatis