当前位置: 首页 > 知识库问答 >
问题:

Spring Data JPA“列xxx中的null值违反了非null约束”对具有postgresql的串行列

楚德辉
2023-03-14

我的实体有一个maporder字段,我希望像下面这样自动递增:

@Entity
public class Map{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(columnDefinition = "serial")
    private Long mapOrder;

    //.......
}

生成的sql看起来不错:

CREATE TABLE map
(
  id bigserial NOT NULL,
  map_order serial NOT NULL,
  ...
)

但当我将其与Spring Data JPA的存储库一起保存时,如下所示:

Map m=new Map();
repo.save(m);

将给我例外:

Caused by: org.postgresql.util.PSQLException: ERROR: null value in column "map_order" violates not-null constraint

有什么想法吗?

共有3个答案

郜杰
2023-03-14

我也有同样的问题。在我的例子中,错误在于创建表。

您需要使用串行类型而不是其他类型(至少在Postgres中)。

前(bigint类型)

CREATE TABLE IF NOT EXISTS sample_table

(
    id BIGINT NOT NULL,
    ...
);

之后(串行类型)

CREATE TABLE IF NOT EXISTS sample_table

(
    id SERIAL NOT NULL,
    ...
);

实体类中的id如下所示:

@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;
薛彭薄
2023-03-14

@GeneratedValue与标识符一起使用,不能与常规字段一起使用。

例如,您可以为序列使用一些对象(使用任何密钥生成策略):

@Entity
public class JpaNoPkSequence {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id", nullable=false, updatable=false)    
    private Long id;
}

用于使用策略GenerationType。序列应在数据库中创建序列:

CREATE SEQUENCE JPA_PK_SEQ START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE;
ALTER SEQUENCE "JPA_PK_SEQ" OWNER TO something;

这应该在密钥定义中指定。您还应该添加与对象的一对一关系,用于获取正则字段的序列:

@Entity 
public class Map {
    @Id
    @SequenceGenerator(name="jpaPkSeq", sequenceName="JPA_PK_SEQ", allocationSize=1, initialValue = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "jpaPkSeq")
    @Column(name = "id", nullable=false, updatable=false)
    private Long id;

    @OneToOne           
    private JpaNoPkSequence sequence;
    ...
}   

希望这有帮助。

戚均
2023-03-14

尝试将您的代码更改为:

@GeneratedValue(strategy = GenerationType.SEQUENCE)

参考:https://stackoverflow.com/a/29028369

 类似资料: