java - 组织.postgresql.util.PSQLException : ERROR: null value in column "id" violates not-null constraint

标签 java postgresql serial-port mybatis

我在 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>

最佳答案

我认为最好的方法是在执行插入时不要将 id 列传递给数据库。新记录将从您那里的序列中获取它们的 id 值。您如何使用您正在使用的这些特定技术来实现这一目标,我不确定,因为我没有使用它们的经验。也许您可以通过 MapperXML 或您拥有的实体类中的一些注释来完成此操作。

关于java - 组织.postgresql.util.PSQLException : ERROR: null value in column "id" violates not-null constraint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20576884/

相关文章:

c# - 如何用多项式 x16 + x12 + x5 + 1 计算 CRC 16

c++ - 通过 RS232 串行端口将数据发送到条码扫描器

java - 在 MacOSX 上安装 `rJava` 失败并显示 "JDK is incomplete!..."

java - 如何在高使用率的多线程环境中以最佳方式清理传出的 UrlConnection 对象?

postgresql - 单击 SQL 查询按钮时,PgAdmin 有时会崩溃

python - 如何将dbmate添加到现有项目中?

java - 如何求涉及对数和求和规则的嵌套 for 循环的时间复杂度?

java - 使用循环发送 URL - Eclipse Java Tomcat

sql - 与查询具有相同 WHERE 子句的子查询

java - 使用Java从串口读取文件