【问题标题】:JPA insert query generation violates non-null constraint in postgresqlJPA插入查询生成违反postgresql中的非空约束
【发布时间】:2015-03-28 04:13:53
【问题描述】:

我正在尝试使用 spring-jpa 在定义为(在 Postgresql 中)的表中插入一个值

CREATE TABLE T_PERSISTENT_AUDIT_EVENT 
(id BIGINT AUTO_INCREMENT NOT NULL, 
principal VARCHAR(255) NOT NULL, 
event_date TIMESTAMP, 
event_type VARCHAR(255), 
CONSTRAINT PK_T_PERSISTENT_AUDIT_EVENT PRIMARY KEY (id));

实体定义为:

@Entity
@Table(name = "T_PERSISTENT_AUDIT_EVENT")
public class PersistentAuditEvent  {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
//...
}

当我的查询被执行时(Spring Security 正在执行它),我得到一个异常,说我试图在表中插入一个空值,违反了非空约束。

查询生成如下:

insert into ... (id, ...) values (null, ...);

如果我从插入语句中删除 id 列,那么我的 auto_increment 将起作用。否则不会。

如何控制 JPA 以使其在插入时忽略我的 id?

【问题讨论】:

  • 我不确定IDENTITY 是如何工作的,但是对于 PostgreSQL,您应该使用GenerationType.SEQUENCEGenerationType.AUTO 来获得类似AUTO_INCREMENT 的功能。 BTW AUTO_INCREMENT 在 PostgreSQL 的纯 SQL 中无效,使用伪类型 serial,或者使用序列。

标签: postgresql hibernate jpa jhipster


【解决方案1】:

我不明白 Spring Security 与它有什么关系。无论如何,根据我的经验,我不在数据库中使用 AUTO_INCREMENT,所以我会删除它;并且不要使用策略 IDENTITY 来生成 id,让它默认,Hibernate 将负责管理你的 id 的序列。

@Entity
@Table(name = "T_PERSISTENT_AUDIT_EVENT")
public class PersistentAuditEvent  {

@Id
@GeneratedValue
@Column(name = "id")
private Long id;
//...
}

【讨论】:

    【解决方案2】:

    尝试更改 ID 生成策略

    @Entity
    @Table(name = "T_PERSISTENT_AUDIT_EVENT")
    @SequenceGenerator(
        name="PersistentAuditEventGenerator",
        sequenceName="PAE_SEQUENCE"
    )
    public class PersistentAuditEvent  {
    
        @Id
        @GeneratedValue(generator="PersistentAuditEventGenerator")
        @Column(name = "id")
        private Long id;
        //...
    }
    

    PostgreSQL 不支持 IDENTITY 列。

    【讨论】:

      猜你喜欢
      • 2018-04-04
      • 2016-01-18
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      • 2021-11-02
      相关资源
      最近更新 更多