首页 > 解决方案 > 如何实现除 id 字段以外的自增字段?

问题描述

我想实现一个自动递增字段,而不是 id 字段,它以 1 开头并按顺序增加 1。

代码示例:

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
private String id; //Id primary key

@Column(name = "request_number", nullable = false, unique = true, updatable = false, insertable = false)
@GeneratedValue(generator = "sequence", strategy = GenerationType.AUTO)
private Long requestNumber; //Talking about this

因此,requestNumber每次创建对象时,这里都应该自动增加。这应该会依次增加。

示例:第一个条目requestNumber将以 and 开头,1下一个requestNumber将分配为2andso on...

我知道这可以通过 java 代码实现,但我正在寻找 JPA 提供这种灵活性。

标签: javasqlsql-serverhibernatejpa

解决方案


@GeneratedValue根据 javadoc,仅用于简单的主键:

GeneratedValue 注释可以与 Id 注释一起应用于实体或映射超类的主键属性或字段。仅需要简单主键支持使用 GeneratedValue 注释。派生的主键不支持使用 GeneratedValue 注释。

如果您想在 JPA 中执行此操作,您可以定义@PrePersist如下方法:

@PrePersist
void doPrePersist() {
    // Use EntityManager to create a native query
    // read next value from a sequence
    // set the field value
}

另一种选择是将数据库列定义为,IDENTITY但这将负责在 JPA 之外自动递增,例如,实体字段将不可插入,并且在实体持久操作期间不会看到值。

请注意,SQL Server 和大多数数据库不保证序列中不会出现间隙。当增加序列的事务被回滚时,序列的值不是,所以你可以最终得到:1、2、4、5、6、10,...


推荐阅读