java - id字段以外的自增字段如何实现?

标签 java sql sql-server hibernate jpa

我想实现一个除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 将以 1 开头,下一个 requestNumber 将以 2等等...

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

最佳答案

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

The GeneratedValue annotation may be applied to a primary key property or field of an entity or mapped superclass in conjunction with the Id annotation. The use of the GeneratedValue annotation is only required to be supported for simple primary keys. Use of the GeneratedValue annotation is not supported for derived primary keys.

如果您想在 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, ...

关于java - id字段以外的自增字段如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63846289/

相关文章:

java - 如何创建动态树?

java - Glassfish SQLite 数据源

mysql - 在 Mysql 中查找用户创建日期?

mysql - 如何在 Go 中构建类型接口(interface)的变量?

php - 使用复合主键生成自增 ID

sql - 让 SQL Server 查询返回零记录而不是聚合无分组依据的单个空记录?

java - Hibernate 从onetomany 中检索列表

java - 将字符串消息放在不同的类中

sql-server - @parameter = @parameter 语法 (SQL Server)

mysql - 如何使用vb.net在sql server上创建表,其中名称由用户输入