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,
}
我注意到会话在第3步中刷新了。 无法理解为什么必须在事务中刷新会话。
答案 0 :(得分:1)
考虑到步骤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()之前没有刷新,它会对仍包含蓝色自行车的数据库行执行查询,因为之前在线上所做的更改(即使所有自行车都变红)将不会#39已经被冲了过来。因此,查询将返回非空的自行车列表,尽管它们应该全部为红色。
更糟糕的是:由于Hibernate会在其第一级缓存中找到自行车,因此蓝色自行车的查询会返回实际上是红色的自行车。