给出以下代码
@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
来验证对象的身份,结果实体管理器是相同的,但是在两种方法中顺序是不同的实例。但是它们仍然具有相同的数据库标识,并且应该只有一个实例,对吧?