实体是否持久填充 id 字段

Does entity persisting populate id field

我的问题是关于 class 对象在 persising 后的 id 字段填充。此 class 示例下方的示例问题

@Entity 
class SomeEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    ...
}

假设我想像这样将新实体持久化到 repo:

SomeEntity entity = new SomeEntity(someArgs);
someEntityRepository.save(entity);

问题是 - 如果我想使用在数据库中自动生成的 id 字段,我是否必须再次提取该实体:

SomeEntity foundEntity = someEntitiyRepository.findTheEntitySomehow(someargs);
System.out.println(foundEntity.getId());

或者我可以开箱即用?

// Copy code from above

SomeEntity entity = new SomeEntity(someArgs);
someEntityRepository.save(entity);
System.out.println(entity.getId());
SomeEntity entity = new SomeEntity(someArgs);
SomeEntity saved= someEntityRepository.save(entity);
Syster.out.println(saved.getId());

每当我们尝试使用 Id 时,状态将更改为持久化状态并获取 Id 值。 我们需要使用存储库 return 对象中的 Id 值。

当您使用存储库保存方法时,Hibernate 不会向数据库发送新记录,直到执行任何刷新操作(如关闭持久上下文或调用 JPQL 语句)。

为确保您拥有一个 ID,您必须手动调用刷新。它可以在任何存储库上调用,并且所有持久上下文都将被刷新。也可以使用 saveAndFlush() 存储库方法。

SomeEntity entity = new SomeEntity(someArgs);
someEntityRepository.saveAndFlush(entity);
System.out.println(entity.getId());
SomeEntity entity = new SomeEntity(someArgs);
someEntityRepository.save(entity);
someEntityRepository.flush();
System.out.println(entity.getId());

请记住,如果您没有未完成的交易(带有 @Transactional 注释),则仅调用 save() 方法也可以。因为 save() 方法将使用自己的 @Transactional 来打开和关闭持久上下文本身。

SomeEntity entity = new SomeEntity(someArgs);
someEntityRepository.save(entity);
System.out.println(entity.getId());