java - 在事务中间刷新 session

标签 java spring hibernate spring-transactions

Stack : spring and hibernate.

service method looks like below,

@Transaction (readonly=false)

public void doSomething(){

    step1: fetch object1,

    step2: modify list from object1 (i.e object1.getListObject2()),

    step3: fetch object3,

    step4: do some more processing,

}

我注意到 session 在第 3 步中被刷新。 无法理解为什么 session 必须在事务中间刷新。

最佳答案

考虑到步骤 2 中所做的更改,它肯定需要刷新,以便在步骤 3 中执行的查询检索正确的值。

让我们举一个简单的例子:

List<Bike> bikes = findAllBikes();
bikes.forEach(bike -> bike.setColor("red"));
List<Bike> blueBikes = findAllBlueBikes();
// blueBikes should be an empty list, right?

如果 Hibernate 在执行 findAllBlueBikes() 之前没有刷新,它将对仍然包含蓝色自行车的数据库行执行查询,因为之前对该行所做的更改(即使所有自行车变为红色)不会被执行还脸红了。因此,查询将返回一个非空的自行车列表,尽管它们应该都是红色的。

更糟糕的是:由于 Hibernate 会在其一级缓存中找到自行车,因此对蓝色自行车的查询将返回实际上是红色的自行车。

关于java - 在事务中间刷新 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33979644/

相关文章:

java - Eclipse "Android Device Chooser"- 目标列中所有设备前面的红叉

java - JDOM 元素创建

Spring 数据 Neo4j : persist() method undefined

spring - 在 Spring Boot 中将 @Conditional 添加到现有的 Spring 注解中

Java 如何在没有 100% CPU 负载的情况下持续监控某些东西?

java - 使用正确的配置突然得到 "NoSuchBeanDefinitionException no bean named"

java - 在 JPA 中映射 Map<Entity, Entity> 结果表中不存在于该描述符中

java - Hibernate with jpa 不会在 Wildfly 中自动创建表

java - 这个 Spring Security 配置到底意味着什么?

java - "IllegalArgumentException occurred while calling setter for property"从sqlserver数字到java对象