我正在学习hibernate,并且了解了Hibernate为Entities
维护的对象状态:Transient
,Persistent
,detached
。
我们希望detached
对象再次成为persisted
的现实生活场景是什么?
我在网上提到了其中一个示例,其中数据在GUI中显示然后分离,一旦用户进行更改,分离的对象将再次保留。
为了更好地理解,可以有除此之外的任何其他示例吗?
答案 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)
这可能很有用,例如,在通过某种处理将数据从一个数据库复制到另一个数据库时。
我们从一个会话中获取一个对象,将其分离,更改一些内容,将该对象放到第二个会话中。