我正在开发一个 SpringBoot 应用程序。
我的严格要求是生成服务器端 a 数字 ID对于一个实体,然后通过存储库将其持久化。
由于每个 @Service 都是无状态的,因此都是单例,因此使用 AtomicLong 是实现它的好方法吗?
这是我的代码。
在服务中,我有这个字段
private final AtomicLong currentId = new AtomicLong();
在被调用方法的服务中,我使用存储库以这种方式保存数据:
myEntityRepository.save(MyEntity.builder()
.id(currentIdNumber.incrementAndGet())
//.... defining other fields
.build());
如果我提供的代码不足以回答我,我会很乐意根据评论编辑我的问题。
不,这是错误的做法。大多数应用程序需要能够支持应用程序的多个实例以实现可用性,一旦存在服务的第二个实例,ID 将不再是唯一的。
即使这是家庭作业,也是学习如何做到这一点的机会。选择错误的 id 分配方式给现实世界的项目带来了巨大的问题,所以了解这一点是一件好事。
已经有一种简单、正常的方法可以做到这一点。
在实体的 ID 字段上添加 @GenerateValue 注解,让数据库使用序列生成 ID,或者将列设置为标识,具体取决于数据库,有的有标识,有的有序列。请参阅本教程https://www.baeldung.com/hibernate-identifiers https://www.baeldung.com/hibernate-identifiers,或者这个非常详细的https://jpa-buddy.com/blog/the-ultimate-guide-on-db- generated/ https://jpa-buddy.com/blog/the-ultimate-guide-on-db-generated/(Spring实际上并没有对此做任何事情,这都是JPA)。数据库可以确保这些 id 是唯一的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)