如何知道已分离的JPA实体是否已被保留?

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

它将在业务层,我会使用entitymanager.contains(Entity)方法,但在我的UI层中,我认为我需要一个额外的属性来指示实体是否已被保存。 怎么实现呢? 我正在考虑暂时关注选项:

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

有什么建议/其他建议吗?

我正在使用JPA 1与Hibernate 3.2实现,并希望坚持标准。

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

本节介绍用于管理实体实例生命周期的EntityManager操作。 实体实例可以被表征为新的,管理的,分离的或被移除的。

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

还有一个图解说明:

替代文字

因此,根据定义,已经保留了一个分离的实体,我实际上并不认为这是您真正的问题。 现在,如果你想知道一个实体是否是新的 (即没有任何持久性身份),那么这个:

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