当前位置: 首页 > 面试题库 >

如何使用JPA获取上一个持久实体的ID

蒋阳华
2023-03-14
问题内容

我正在寻找一种聪明且易于理解的方法来使用获取持久化实体的ID JPA。ID是Integer

可以想到以下解决方案:

  1. 没有使用GeneratedValue策略。这要求在保留之前先查找一个免费的id,然后将其放入要保留的实体中:麻烦,但可以。
  2. GeneratedValue策略。持久性提供程序将负责生成id。这看起来更聪明,但是如何获取ID?

请参阅下面的解决方案2

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

这会显示一个空ID!

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


问题答案:

不能保证生成ID。保证仅在刷新时间生成ID。因此,如果您在交易结束之前确实需要ID(因此刷新了实体管理器),请显式调用flush()以获得ID:

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


 类似资料:
  • 我有一个实体,代表客户发送的订单,这个订单可能会在电话上与客户讨论后更新,但客户发送的初始订单必须保持不更新。我如何可以保持同一实体两次,是否有效的使用深层克隆。我试图分离实体以便持久化上下文持久化一个新的,但是持久化上下文仍然在更新第一个条目。

  • 我有一个物品清单。它们是JPA“位置”实体。 我有一个无状态EJB,它在列表中循环并持久化每一个。 代码运行良好。我没有任何问题。然而,问题是:我希望这是一个全有或全无的交易。当前,每次通过for循环,persist()方法都会在数据库中插入一个新行。假设我有100个location对象,而第54个对象有问题,并且抛出了一个异常。将有53条记录插入数据库。我想要的是:在任何一个成功之前,他们必须全

  • 我与以下实体类有一个双向的一对多关系: 当然,所有必需的级联选项都是在客户端设置的。但如果在引用现有产品订单时首次持久化新创建的客户端(如本场景所示),则它将不起作用: 已创建并持久化产品订单“%1”。工作正常。 已创建客户端“%2”,并将产品订单“%1”添加到其产品订单列表中。然后它被持久化。不起作用。 我尝试了几个apporach,但没有一个显示出预期的结果。请参阅下面的结果。我在这里阅读了所

  • 我试图集成Spring和JSF,我坚持使用对象。我不想处理事务(begin-commit等) 经过一些谷歌,我可以找到一个答案,给我需要在这个链接 我使用eclipselink作为ORM和Oracle 11g数据库,并使用带有Maven的Glassfish Server3.1。我更喜欢Spring配置的注释。我用 相关类中的注释。我的名称是E_DefterManagementPU,我的事务类型是J

  • 问题内容: 对于每个@Entity,我需要执行以下操作: 如果该实体不存在,则持久保存该实体,并知道其是否存在。尽管我意识到这不是继承关系,但我尝试使用Entity来实现@Entity。我可以使用什么类来引用每个JPA实体?我可以只创建一个接口/抽象类MyEntities并让它们全部继承,但是这样吗?我希望更少的代码。另外,我希望能够提取每个实体的主键,就像我在.getId()中尝试的那样。 问题

  • 我有一个JavaEE项目,它使用多个持久性单元。有没有办法指定特定JPA实体所属的持久性单元?一些实体位于一个数据源中,而其他实体位于我的第二个数据源中。有没有一种方法可以通过注释来区分两者?