分离的实体仍处于持久性上下文中

时间:2019-01-17 07:20:23

标签: hibernate jpa

给出以下代码

@Transactional
@GetMapping("/load")
public String load() throws InterruptedException {
    final Order order87 = ... load via dao which uses the entityManager
    log.info("1 load order87 is in persistence context: {}", entityManager.contains(order87));
    Thread.sleep(10000);
    entityManager.detach(order87);
    log.info("2 load order87 is in persistence context: {}", entityManager.contains(order87));
    return "loading done";
}

@Transactional
@GetMapping("/save")
public String save() throws InterruptedException {
    final Order order87 = ... load via dao which uses the entityManager
    log.info("1 save order87 is in persistence context: {}", entityManager.contains(order87));
    Thread.sleep(20000);
    log.info("2 save order87 is in persistence context: {}", entityManager.contains(order87));
    order87.setName("Cup");
    orderDao.save(order87);
    return "saving done";
}

当两个方法都一个接一个地执行时-由于每个entityManager只有一个持久性上下文-我本来期望以下内容:

1 load order87 is in persistence context: true
1 save order87 is in persistence context: true
2 load order87 is in persistence context: false
2 save order87 is in persistence context: false

但是是

1 load order87 is in persistence context: true
1 save order87 is in persistence context: true
2 load order87 is in persistence context: false
2 save order87 is in persistence context: true

两个方法都在单独的事务中运行,但是它们共享entityManager及其持久性上下文。在这两种方法中,entityManager和order87都具有对应的哈希码,即它是相同的对象和相同的实体管理器。该订单也具有相同的持久性(数据库)ID。

并且由于:“任何时候在持久性上下文中都只能存在一个具有相同持久性身份的Java实例。例如,如果持久性上下文中具有持久性标识(或id)为158的Employee,则不会ID设置为158的其他Employee对象可能存在于同一持久性上下文中。” (“ Pro JPA 2”,第2版,2013年)我希望在load方法将其分离之后,该命令也将在save方法中分离。

这是怎么工作的?

更新 我使用System.identityHashCode来验证对象的身份,结果实体管理器是相同的,但是在两种方法中顺序是不同的实例。但是它们仍然具有相同的数据库标识,并且应该只有一个实例,对吧?

0 个答案:

没有答案