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

Java 强制Hibernate读取数据库而不返回缓存的实体,java,spring,hibernate,caching,Java,Spring,Hibernate,Caching,我正在为我的web应用程序使用Hibernate和Spring 在数据库操作中,Hibernate缓存实体并在下一个请求中返回它们,而不读取实际的数据库。我知道这将减少数据库的负载并提高性能 但是,当这个应用程序还在构建中时,我需要在每个请求中从数据库加载数据(测试原因) 有没有办法强制读取数据库? 我从这个log4j消息中确定了缓存 Returning cached instance of singleton bean 'HelloController' DEBUG [http-bio-808

我正在为我的web应用程序使用Hibernate和Spring

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

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

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

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

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

session.refresh(entity)
entityManager.refresh(entity)
(如果使用JPA)将从数据库中提供新数据。

在新事务中读取

例如:

...
MyDTO myDTO = fetchMyDTOById(daoId);
...
@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
private MyDTO fetchMyDTOById(Long dtoId) {
    return repository.findById(dtoId);
}
  • 调用刷新实体
    会话。刷新(实体)

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

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

请调用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
....
....
}

可能重复我没有使用JPA。那么我是否需要将
session.get()
更改为
session.refresh()
?或者是否有方法检查它是否来自缓存。?否,您应该在
session.get()
之后使用
session.refresh()
,因为它只适用于连接的实体。要检查实体是否已加载,有一些建议,但没有可靠的imho。这种方法的诀窍是,当实体不存在于数据库中,但存在于缓存中时,调用
refresh()
throws
org.hibernate.unsolvableObjectException:不存在具有给定标识符的行
@adamsiemion Yes,这是一件应该注意的事情。我在问题中也有同样的问题。对于JPA,似乎
entityManager.clear()
在一次操作中放弃了整个缓存。