需要保留分离对象的真实场景:Hibernate

时间:2017-12-25 18:37:39

标签: hibernate jpa

我正在学习hibernate,并且了解了Hibernate为Entities维护的对象状态:TransientPersistentdetached

我们希望detached对象再次成为persisted的现实生活场景是什么?

我在网上提到了其中一个示例,其中数据在GUI中显示然后分离,一旦用户进行更改,分离的对象将再次保留。

为了更好地理解,可以有除此之外的任何其他示例吗?

2 个答案:

答案 0 :(得分:1)

我们有一个场景,因为一些糟糕的实现设计,我们需要从一个服务层中的事务(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
    ...
}

还必须有其他场景。

希望这能够清除你对分离的和后来存在的实体的疑虑。

答案 1 :(得分:0)

这可能很有用,例如,在通过某种处理将数据从一个数据库复制到另一个数据库时。

我们从一个会话中获取一个对象,将其分离,更改一些内容,将该对象放到第二个会话中。