【问题标题】:org.postgresql.util.PSQLException: ERROR: null value in column "id" violates not-null constraintorg.postgresql.util.PSQLException:错误:“id”列中的空值违反非空约束
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用 BIGSERIAL 而不是创建手动序列。

    CREATE TABLE "user" 
    (
     id BIGSERIAL,
     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
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      相关资源
      最近更新 更多