如何知道分离的 JPA 实体是否已持久化?

2022-09-01 14:16:19

我在应用程序的 Web UI 层中有一个 JPA 实体实例。我想知道这个实体是否已经保留在数据库中,或者它是否只存在于用户会话中。

它将在业务层中,我将使用entitymanager.contains(Entity)方法,但在我的UI层中,我认为我需要一个额外的属性来指示实体是否已保存。如何实现它?我目前正在考虑以下选项:

  • 具有数据库设置的默认值的 JPA 属性,但会在每次更新后强制进行新的读取?
  • 在我的代码中手动设置或由JPA自动设置的非JPA属性?

任何建议/其他建议?

我正在使用JPA 1和Hibernate 3.2实现,并且更愿意坚持标准。


答案 1

首先,让我们提醒一个实体的各种状态。来自 JPA 1.0 规范(在 3.2 实体实例的生命周期中):

本节介绍用于管理实体实例生命周期的 EntityManager 操作。实体实例可以描述为新建、托管、分离或删除。

  • 新的实体实例没有持久性标识,并且尚未与持久性上下文关联。
  • 托管实体实例是具有当前与持久性上下文关联的持久标识的实例。
  • 分离的实体实例是具有不(或不再)与持久性上下文关联的持久标识的实例。
  • 已删除的实体实例是具有持久性标识(与持久性上下文关联)的实例,计划从数据库中删除。

和图形说明:

alt text

所以,根据定义,一个独立的实体已经存在,我实际上并不认为这是你的真正问题。现在,如果你想知道一个实体是否是新的(即没有任何持久标识),那么这个呢:

@Transient
public boolean isNew() {
    return (this.id == null);
}

答案 2

推荐