jpa_缓存

查询缓存

https://blog.csdn.net/qq_24084925/article/details/51890194

如果想要使用缓存,只查询一次,可以使用setHint

Query query = entityManager.createQuery(jpql).setHint(QueryHints.HINT_CACHEABLE, true);

注意:这里的QueryHints是org.hibernate.ejb.QueryHints包下的,并且,使用查询缓存的前提是在配置文件中配置了启用查询缓存

<property name="hibernate.cache.use_query_cache" value="true"/>


使用二级缓存

https://blog.csdn.net/abc997995674/article/details/80236865 

一级缓存
一级缓存是session级别的缓存,在JPA中一个entityManager对应一个session,一个session就对应一个缓存。

查询两次id为1的user

User user1 = entityManager.find(User.class, 1);
User user2 = entityManager.find(User.class, 1);
1
2
结果发现只调用了一次sql查询,因为使用了一级缓存,当第一次find就把查询到的数据放入到还缓存中,第二次再查会先去缓存中找,如果有就直接使用而不用重新查询。

 

如果查询一次后,关掉entityManager,再查询

User user1 = entityManager.find(User.class, 1);
entityManager.close();
entityManager = factory.createEntityManager();
User user2 = entityManager.find(User.class, 1);
1
2
3
4
发现查询了两次,因为entityManager关闭之后,其对应的缓存也就没有了。
然后有重新开启一个entityManager,就和之前的不是同一个了。

 

 

jpa--8.api(EntityTransaction)

https://blog.csdn.net/qq_26553781/article/details/79721530

1.1  概念

EntityTransaction接口用来管理资源层实体管理器的事务操作。通过调用实体管理器的getTransaction方法获得其实例。

1.2  方法

• begin ()

用于启动一个事务,此后的多个数据库操作将作为整体被提交或撤消。若这时事务已启动则会抛出 IllegalStateException 异常。

• commit ()

用于提交当前事务。即将事务启动以后的所有数据库更新操作持久化至数据库中。

• rollback ()

撤消(回滚)当前事务。即撤消事务启动后的所有数据库更新操作,从而不对数据库产生影响。

• setRollbackOnly ()

使当前事务只能被撤消。

• getRollbackOnly ()

查看当前事务是否设置了只能撤消标志。

1.3  参考

原文地址:https://www.cnblogs.com/cxqbk/p/10563602.html