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

时间:2010-05-06 09:11:18

标签: java hibernate orm jpa persistence

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

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

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

有任何建议/其他建议吗?

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

1 个答案:

答案 0 :(得分:46)

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

  

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

     
      
  • 实体实例没有持久身份,现在还没有   与持久化上下文相关联。
  •   
  • 托管实体实例是具有持久标识的实例   当前与持久性上下文相关联。
  •   
  • 分离的实体实例是具有持久标识的实例   那不是(或不再)与持久化上下文相关联。
  •   
  • 已删除实体实例是一个具有持久性标识的实例,与持久性上下文相关联,计划从数据库中删除。
  •   

图示说明:

alt text

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

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