休眠一级缓存如何与DAO类上的@Transactional一起使用

时间:2019-11-23 10:02:57

标签: hibernate spring-boot jpa

我知道的事情: 休眠一级缓存是自动启用的,并且是特定于会话的。

我有这堂课,我只是想检查一级缓存是否正常工作。

@Repository
@Transactional
public class StudentDaoImpl implements ServiceDao {
    /**
     * The EntityManager invokes
     * the hibernate session under the hood.
     */
    @Autowired
    private EntityManager entityManager;

    public <T> List<T> fetchAll(Class<T> type) {
        // entityManager.unwrap creates a new Session if it does not exist

        Session session = entityManager.unwrap(Session.class);
        CriteriaBuilder builder = session.getCriteriaBuilder();
        CriteriaQuery<T> query = builder.createQuery(type);

        // getting All data from Table
        query.from(type);
        List<T> list = session.createQuery(query).getResultList(); // 1st query gets fired
        List<T> list1 = session.createQuery(query).getResultList(); // 2nd query gets fired
        return list;

    }

我原以为只有一个查询会被触发,但是即使我们处于同一个会话中(如果不是错误的话),也会有2个查询被触发

1 个答案:

答案 0 :(得分:0)

会话缓存按ID缓存实体。如果使用相同的ID两次调用 Parameters: loadOnStartup - the initialization priority of the Servlet Throws: IllegalStateException - if the ServletContext from which this ServletRegistration was obtained has already been initialized ,将仅执行1个查询。

只能使用查询缓存来完成查询的缓存。否则,执行查询将始终...执行查询。

请注意,JPA API允许创建条件查询而无需展开会话。