我正在学习hibernate,并开始了解Hibernate为Entities
维护的Object状态:Transient
,Persistent
,detached
。
我们希望将detached
对象再次成为persisted
的现实生活场景是什么?
我在网上提到了其中一个示例,其中数据在GUI中显示然后分离,一旦用户进行更改,分离的对象将再次保留。
为了更好地理解,可以有除此之外的任何其他示例吗?
我们有一个场景,因为一些糟糕的实现设计,我们需要在一个服务层中的事务(editJobPost
)内调用另一个具有自己的事务的服务层(checkSuspicion
)。
@Transactional(rollbackFor = { RuntimeException.class, EntityException.class })
public JobPostResponseDto editJobPost(EditJobPostRequestDto requestDto) throws EntityException {
...
if (Constants.JOB_POST_ACTIONS.EDIT.equals(requestDto.getAction())) {
jobPost = checkSuspicion(jobPost, jobPost.getJobType(), jobPost.getStatus(), requestDto); //checkSuspicion had its own transaction.
}
entityManager.merge(jobPost);
...
}
现在由于editJobPost
方法的持续交易,然后在checkSuspicion
,entityManager
出现了分离的问题。
因此,我们将jobPost
实体与第一个事务分离,然后将其合并。
更新的方法如下
@Transactional(rollbackFor = { RuntimeException.class, EntityException.class })
public JobPostResponseDto editJobPost(EditJobPostRequestDto requestDto) throws EntityException {
...
entityManager.detach(jobPost); //object detached
if (Constants.JOB_POST_ACTIONS.EDIT.equals(requestDto.getAction())) {
jobPost = checkSuspicion(jobPost, jobPost.getJobType(), jobPost.getStatus(), requestDto); //checkSuspicion had its own transaction.
}
entityManager.merge(jobPost); //merged later
...
}
还必须有其他场景。
希望这能够清除你对分离的和后来持久的实体的疑虑。
这可能很有用,例如,在通过某种处理将数据从一个数据库复制到另一个数据库时。
我们从一个会话中获取一个对象,将其分离,更改一些内容,将此对象放到第二个会话中。