如何使用 JPA 获取最后一个持久化实体的 ID
Posted
技术标签:
【中文标题】如何使用 JPA 获取最后一个持久化实体的 ID【英文标题】:How to get Id of last persisted entity using JPA 【发布时间】:2012-03-27 19:35:34 【问题描述】:我正在寻找一种智能且易于阅读的方法来使用 JPA
获取持久实体的 id。 id 是Integer
。
可以想到以下解决方案:
-
不使用
GeneratedValue
策略。这需要在持久化之前寻找一个空闲的 id,然后将其放入要持久化的实体中:很麻烦,但可以。
使用GeneratedValue
策略。持久性提供者将负责 id 的生成。这看起来更聪明,但是如何获取 id 呢?
解决方案2见下文
MyEntity en = new MyEntity();
en.setName("My name");
em.persist(en);
System.out.println(en.getId());
这会打印一个空 id!
有什么建议吗?我正在使用 mysql、EclipseLink,但需要一个可移植的解决方案。
【问题讨论】:
【参考方案1】:persist 不保证生成 ID。 ID 保证仅在刷新时生成。因此,如果您在事务结束之前确实需要 ID(并且因此刷新了实体管理器),请显式调用 flush() 以获取 ID:
MyEntity en = new MyEntity();
en.setName("My name");
em.persist(en);
em.flush();
System.out.println(en.getId());
【讨论】:
@JB Nizet,如何在persist()
方法之前获得 id?我很期待它,因为我想更改自定义 ID 格式?
@CycDemo:你不能,除非你自己生成。
@JBNizet “persist 不保证生成ID”语句的来源在哪里?在 JPS Spec (JSR) 中,我阅读了以下两条语句(第 3.2 章): - 托管实体实例是具有持久标识的实例 - 应用于实体 X 的持久操作的语义如下:如果 X 是一个新的实体,它成为托管的。 ... 如果我逐字解释,我会说规范要求在调用 persist() 之后设置 Id。这也是 Hibernate 的行为。
docs.jboss.org/hibernate/core/4.3/manual/en-US/html/…
这仅适用于 em.persist(en),但不适用于 em.merge(en)。使用合并它返回 null。以上是关于如何使用 JPA 获取最后一个持久化实体的 ID的主要内容,如果未能解决你的问题,请参考以下文章