强制Hibernate读取数据库而不返回缓存实体

时间:2015-01-12 15:13:51

标签: java spring hibernate caching

我正在使用Hibernate和Spring作为我的Web应用程序。

在数据库操作中,Hibernate正在缓存实体并在下一个请求中返回它们而不读取实际的数据库。我知道这将减少数据库的负担并提高性能。

但是当这个应用程序仍在构建中时,我​​需要在每个请求中加载数据库中的数据(测试原因)。

有没有办法强制数据库读取?

我从这个log4j消息中确定了缓存。

Returning cached instance of singleton bean 'HelloController'
DEBUG [http-bio-8080-exec-42] - Last-Modified value for [/myApp/../somePageId.html] is: -1

5 个答案:

答案 0 :(得分:14)

session.refresh(entity)entityManager.refresh(entity)(如果您使用JPA)将为您提供来自数据库的最新数据。

答案 1 :(得分:9)

在新交易中进行阅读。

例如:

...
MyDTO myDTO = fetchMyDTOById(daoId);
...
@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
private MyDTO fetchMyDTOById(Long dtoId) {
    return repository.findById(dtoId);
}

答案 2 :(得分:0)

  • 调用刷新实体session.refresh(entity)

  • 打开新会话,然后调用session2.get(EntityClass.class,id)它将从数据库中提取实体

        Session session2=sessionFactory.openSession();                  
        EntityClass entity=(EntityClass) session2.get(EntityClass.class, id);
    

答案 3 :(得分:0)

请调用EntityManger.clear()方法,然后根据需要调用repository.find()或repository.findOne()从数据库中选择更新的数据。

@PersistentContext EntityManager em;
@Autowired EntityReporisitory rep;
....
....
@Transactional
public void method(){
....
....
em.clear();// This line will clear the current value of entity
Entity e = rep.find(example);// In this line data will be loaded freshly from DB
....
....
}

答案 4 :(得分:-2)

只需注释配置类中的@EnableCaching批注即可禁用缓存,尽管其他缓存批注仍然存在。而且,您随时可以启用缓存即可取消注释。