设置了 id 的瞬态实体仍然是瞬态实体还是分离实体

Is a transient entity with id set still a transient entity or a detached entity

根据定义,新实例化的 POJO,比如说 transientPerson,是一个瞬态实体。

Person transientPerson = new Person();

从持久上下文分离的实体是分离的实体。

Person detachedPerson = session.get(Person.class, id);
session.detach(detachedPerson);

detachedPerson的所有字段都设置成transientPerson后,transientPerson还是一个瞬态实体吗?

transientPerson.setId(detachedPerson.getId());
transientPerson.setName(detachedPerson.getName());

如果是这样,是否意味着我可以使用persist(transientPerson)更新数据库中相应的table?

瞬态实体和分离实体之间的主要区别在于该实体是否真的在数据库中存在相应的记录。瞬态实体没有,但分离实体有(参见 there 的官方定义)。

所以在这种情况下,transientPerson 技术上将变得分离,因为确实存在一个 DB 记录。

并且在数据库中已经存在的实体(即分离的实体)上调用 persist() 将抛出 EntityExistsException。您必须使用 merge() 来插入或更新分离的。