一尘不染

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

hibernate

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

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

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

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

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


阅读 230

收藏
2020-06-20

共1个答案

一尘不染

首先,让我们提醒一下实体的各种状态。根据JPA 1.0规范(在第3.2节“实体实例的生命周期”中):

本节介绍了用于管理实体实例生命周期的EntityManager操作。实体实例的特征可以是新的,管理的,分离的或删除的。

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

和一个图形化的插图:

替代文字

因此,根据定义,一个独立的实体已经存在,实际上我不认为这是您的真正问题。现在,如果您想知道一个实体是否是 实体(即没有任何持久身份),那该怎么办:

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