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

sno*_*ake 27 java orm persistence hibernate jpa

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

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

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

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

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

Pas*_*ent 46

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

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

  • 一个新的实体实例有没有持久化标识,并且尚未与一个持久化上下文关联.
  • 一个管理实体实例的实例与持久标识 当前与一个持久化上下文关联.
  • 分离实体实例的实例与持久标识 与一个持久上下文相关联不是(或不再).
  • 一个删除实体实例与持久标识,与一个持久化上下文相关联,即定于从数据库中取出一个实例.

还有一个图解说明:

替代文字

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

@Transient
public boolean isNew() {
    return (this.id == null);
}
Run Code Online (Sandbox Code Playgroud)

  • @snowflake问题是JPA不支持非pk属性的数据库生成值,所以你必须使用JPA提供者扩展(如`@ org.hibernate.annotations.Generated`)或者在持久化后刷新你的实体,这是丑陋的.我想知道使用`@GeneratedValue`是不是更好的选择. (2认同)
  • 在某处,我读到了使用@Version,默认值为null.您可以检查版本是否!= null,因为它应该在每次写入时更新.但是,我看到的例子是使用xml.尚未自己测试(尚) (2认同)