根据定义,新实例化的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)
来更新DB中相应的表?
暂态实体和分离实体的主要区别在于该实体在DB中是否真的有相应的记录存在。暂态实体没有,但分离实体有(见官方定义)。
所以在这种情况下,transientPerson
技术上将被分离,因为它确实存在一个DB记录。
并且对已经存在于DB中的实体(即分离实体)调用persist()
将抛出EntityExistsException
。您必须使用merge()
来插入或更新已分离的。