如何使用 JPA 获取上次持久化实体的 ID

2022-09-01 15:18:26

我正在寻找一种智能且易于阅读的方式,以使用获取持久化实体的ID。该 ID 是一个 .JPAInteger

人们可以想到以下解决方案:

  1. 不使用策略。这需要在持久化之前查找一个免费的id,然后将其放入要持久化的实体中:繁琐,但有效。GeneratedValue
  2. 有策略。持久性提供程序将负责 id 生成。这看起来更聪明,但如何获取id?GeneratedValue

有关解决方案 2,请参见下文

MyEntity en = new MyEntity();
en.setName("My name");
em.persist(en);
System.out.println(en.getId());

这将打印一个空 ID!

有什么建议吗?我正在使用MySql,EclipseLink,但需要一个可移植的解决方案。


答案 1

持久性不能保证生成 ID。该 ID 保证仅在刷新时生成。因此,如果在事务结束之前确实需要 ID(因此实体管理器被刷新),请显式调用 flush() 以获取 ID:

MyEntity en = new MyEntity();
en.setName("My name");
em.persist(en);
em.flush();
System.out.println(en.getId());

答案 2

推荐