我的实体有一个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
有什么想法吗?
答案 0 :(得分:1)
尝试将代码更改为:
@GeneratedValue(strategy = GenerationType.SEQUENCE)
答案 1 :(得分:0)
@GeneratedValue
适用于标识符,您无法在常规字段中使用它。
例如,您可以使用一些对象作为序列(使用任何密钥生成策略):
@Entity
public class JpaNoPkSequence {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id", nullable=false, updatable=false)
private Long id;
}
要使用策略GenerationType.SEQUENCE
,应在数据库中创建序列:
CREATE SEQUENCE JPA_PK_SEQ START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE;
ALTER SEQUENCE "JPA_PK_SEQ" OWNER TO something;
这应该在密钥定义中指定。您还应该为将用于获取常规字段序列的对象添加one-to-one
关系:
@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;
...
}
希望这有帮助。