JPA插入查询生成违反了postgresql中的非null约束

时间:2015-01-29 02:48:54

标签: postgresql hibernate jpa jhipster

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

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, ...);

如果我从insert语句中删除id列,那么我的auto_increment会起作用。否则它没有。

如何控制JPA以便忽略插入中的id?

2 个答案:

答案 0 :(得分:0)

尝试更改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列。

答案 1 :(得分:0)

我没有得到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;
//...
}