java - 如何实现除 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
将分配为2
andso on...
我知道这可以通过 java 代码实现,但我正在寻找 JPA 提供这种灵活性。
解决方案
@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,...
推荐阅读
- rest - 为什么使用 Google Cloud Drive Rest API file.list 无法获取所有文件?
- python - 如何在 py 编辑器中添加多个 @app.route?
- python-3.x - Python3:在空的熊猫数据框中添加多列行
- php - 有时 ftp_connect() 不能在 php 中工作,其余时间它工作得很好
- javascript - 如何在另一个页面中使用表单选择值
- dvd - 如何将 DVD 复制到本地系统?
- solid-principles - 关于 SOLID 编程实践的实用问题
- sql - 在一个查询中将工资总和与每年的工资增长相加 - SQL PostgreSQL
- tensorflow - OpenCV DNN,从 tensorflow 断言导入 .pb 文件失败错误:函数“populateNet”中的 scaleMat.type() == CV_32FC1
- sql-server - 生成动态 PATINDEX 语句