我在网络应用中使用 Hibernate 和 Spring (在模式 OpenSessionInView 中)。
我已经引入 Quartz 来安排Job进行检查。 为了能够将bean注入作业,我使用了以下方法:https://gist.github.com/jelies/5085593
我的应用中的工作就像:
@Service
public class SampleJob implements Job {
@Autowired
private SampleBusiness sampleBusiness;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
for(Student student : sampleBusiness.getStudents()) {
System.out.println(student.getName());
}
}
}
当webapp启动时,在第一次执行Job时,结果为:
结果还可以。
之后,我在“Tommy”中更改了webapp的名称“Tom”。
在下次执行Job时,结果是:
为什么Hibernate会话保存旧数据?
我想我必须像对待我的其他豆子那样依附于Job一个拦截器,但是我无法将它附加到Job上。
由于
答案 0 :(得分:0)
上述情况的可能原因可能是hibernate的缓存。
Hibernate使用两级缓存,1级缓存和2级缓存。 1级缓存会缓存经常读取的数据,但是如果hibernate缓存中没有数据,则它会在2级缓存中查找相同内容。
如果数据存在于缓存级别2中,则它返回数据,如果此处不存在数据,则它实际上会命中数据库以检索数据。
在尝试使用相同的方法之前,您应该尝试清除缓存数据。
虽然每当您从缓存数据更新记录时,都会重新缓存此数据。但是如果您尝试更新其他线程或会话中的数据,它可能不会反映在第一个线程中,因为数据已存在于此会话的1级缓存中。
我希望这会让你走向正确的方向。