三年总结出来的11个JPA和Hibernate查询配置小技巧
JPA和Hibernate提供了一系列暗示hints能够帮助你更好地定制你的查询语言,这些小暗示或暗语是一种附加信息,你可以利用这些暗语做很多事情,比如设置查询的timeout,使用实体图或定义查询缓存的缓存。
在我们介绍一系列暗语之前,首先我们看看如何使用查询暗语,你可以在EntityManager.find 方法中使用它,EntityManager.find接受一个HashMap<String,Object>类型,该HashMap的值就是你提供的暗语设置,相当于提供一个附加参数。
EntityGraph<?> graph = em.getEntityGraph(“graph.AuthorBooks”);HashMap<String, Object> properties = new HashMap<>();properties.put(“javax.persistence.fetchgraph”, graph);em.find(Author.class, 1L, properties);
注意到properties是一个HashMap的值,里面是你要设置的暗语javax.persistence.fetchgraph
此外,Query接口提供了setHint(String name, Object value)方法来设置暗语:
EntityGraph<?> graph = em.getEntityGraph(“graph.AuthorBooks”);em.createQuery(“SELECT a FROM Author a”).setHint(“javax.persistence.fetchgraph”, graph).getResultList();
你也能使用@NamedQuery提供暗语设置:
@NamedQuery(name = “selectAuthors”, query = “SELECT a FROM Author a”, hints = @QueryHint(name = QueryHints.COMMENT, value = “a custom SQL comment”))
这样暗语将在每个named query的实例中使用,你就不必再设置了:
em.createNamedQuery(“selectAuthors”).getResultList();
好了,上面介绍了使用方法,下面是暗语的列表介绍:
JPA Hints
1. javax.persistence.lock.timeout (Long – milliseconds)
获得一个持久锁的timeout
2. javax.persistence.query.timeout (Long – milliseconds)
定义了一个查询在其被取消之前运行运行多长时间,Hibernate并不提供,而是希望借助JDBC驱动的 JDBCStatement.setTimeout 方法实现.
3. javax.persistence.cache.retrieveMode (CacheRetrieveMode – USE | BYPASS)
retrieveMode 支持值 USE 和 BYPASS ,告诉 Hibernate:如果使用USE ,使用二级缓存查询返回一个实体,而使用 BYPASS 就是直接从数据库获得这个实体。
4. javax.persistence.cache.storeMode (CacheStoreMode – USE | BYPASS | REFRESH)
定义了如何将一个改变的实体写入二级缓存中,使用 USE 表示使用缓存,如已经存在即修改,如缓存中不存在就将实体加入缓存,,如果使用BYPASS 只更新已经存在的实体,如果不存在就不加入缓存。如果使用 REFRESH,在实体从缓存中抓取之前首先将实体放入缓存。
5. javax.persistence.loadgraph (EntityGraph)
提供一个实体图作为加载图(load graph)给查询。
6. javax.persistence.fetchgraph (EntityGraph)
提供一个实体图作为一个fetchgraph用于查询
下面是Hibernate Hints部分:
7. org.hibernate.flushMode (FlushMode – AUTO | ALWAYS | COMMIT | MANUAL)
如果你修改一个实体,Hibernate还在一级缓存中保留这些改变,直到全部flush到数据库,默认情况下,这会在每次查询之前发生flush,但是你能提供一个flushMode的值来控制flush的时机::
AUTO = 由Hibernate决定是否将修改后的实体写入数据库
ALWAYS = 在每次查询之前都会写入
COMMIT = Hibernate不会将修改写入数据库直到事务被提交了
MANUAL = 你得自己将会话中修改flush到数据库中。
8. org.hibernate.readOnly (boolean)
如果你不想将任何修改应用到实体,你能设置这个值为真true,这会失效Hibernate的脏数据检查,提高性能。
9. org.hibernate.fetchSize (Long – number of records)
Hibernate提供这个值给JDBC驱动,定义在一个批处理的查询行数,这能提高JDBC和数据库之间的通讯效率。
10. org.hibernate.comment (String – custom comment)
如果在persistence.xml 文件设置这个值true, Hibernate会为每个查询产生一个comment,将其写入到日志文件,如果你需要分析巨量和复杂SQL日志有用。
11. org.hibernate.cachable
如果你要使用Hibernate的查询缓存,你得在persistence.xml 文件中配置它,将这个值设为true。
写在最后:欢迎留言讨论,加关注,持续更新!!!
三年总结出来的11个JPA和Hibernate查询配置小技巧的更多相关文章
- 11个强大的Visual Studio调试小技巧
简介 调试是软件开发周期中很重要的一部分.它具有挑战性,同时也很让人疑惑和烦恼.总的来说,对于稍大一点的程序,调试是不可避免的.最近几年,调试工具的发展让很多调试任务变的越来越简单和省时. 这篇文章总 ...
- 11个强大的Visual Studio调试小技巧(转)
简介 调试是软件开发周期中很重要的一部分.它具有挑战性,同时也很让人疑惑和烦恼.总的来说,对于稍大一点的程序,调试是不可避免的.最近几年,调试工具的发展让很多调试任务变的越来越简单和省时. 这篇文章总 ...
- 11个不常被提及的JavaScript小技巧
这次我们主要来分享11个在日常教程中不常被提及的JavaScript小技巧,他们往往在我们的日常工作中经常出现,但是我们又很容易忽略. 1.过滤唯一值 Set类型是在 ES6中新增的,它类似于数组,但 ...
- JPA和Hibernate的相关使用技巧
介绍 尽管有SQL标准,但每个关系数据库终将是唯一的,因此你需要调整数据访问层,以便充分利用在使用中的关系数据库. 在本文中,我们将介绍在使用带有JPA和Hibernate的MySQL时,为了提高性能 ...
- 超强干货,11个灰常实用的AI设计小技巧!
11个超级实用的AI设计小技巧!涉及到很多的实用操作,纯干货经验总结,灰常值得收藏,赶快转走学起来吧! 编辑:千锋UI设计
- 使用JPA和Hibernate进行批量处理的最佳方式
Tips 原文作者:Vlad Mihalcea 原文地址:The best way to do batch processing with JPA and Hibernate 在本文中,你将了解什么是 ...
- JPA和hibernate的关系
实际上,JPA的标准的定制是hibernate作者参与定制的,所以JPA是hibernate的一个总成,可以这么理解
- JPA与Hibernate的关系
1.JPA JPA全称: Java Persistence API JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. JPA的出现? JPA ...
- Spring Data Jpa 详解 (配置篇)
前言: JPA全称Java Persistence API,即Java持久化API,它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据,结合其他ORM的使用,能达到简化开发 ...
随机推荐
- NET-使用Js调用WebService
注:JsWebServiceObject 此类是我做测试示例时为了测试js是否能调用webService中的复合类型而单独新建的一个类 此类中只有名字与年龄的属性. 最近身边的一个朋友做项目,其中有一 ...
- maven:清除lastUpdated文件
项目使用maven管理jar包,很容易因为各种原因(网速慢.断网)导致jar包下载不下来,出现很多.lastUpdated文件.这些文件一个一个删除太麻烦.下面是全部删除的方法 windows系统 c ...
- charles 批量重复请求/重复发包工具
本文参考:charles 批量请求 重复发包工具/repeat Charles 让你选择一个请求并重复,在测试后端接口的时候非常有用: Charles将请求重新发送到服务器,并将响应显示为新请求. 如 ...
- Spring 使用复选选按钮
模型层需要提供数据选项,设置错误信息 关键代码 @NotNull @Size(min = 1, max = 5, message = "选择课程") private String[ ...
- 使用Rabbit MQ消息队列
使用Rabbit MQ消息队列 综合概述 消息队列 消息队列就是一个消息的链表,可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息 ...
- 多线程调用有参数的方法---c# Thread 与 Task
C#实现多线程的方式:Task——任务 简介 .NET 4包含新名称空间System.Threading.Tasks,它 包含的类抽象出了线程功能. 在后台使用ThreadPool. 任务表示应完 ...
- 教你成为全栈工程师(Full Stack Developer) 四十五-一文读懂hadoop、hbase、hive、spark分布式系统架构
转载自http://www.shareditor.com/blogshow?blogId=96 机器学习.数据挖掘等各种大数据处理都离不开各种开源分布式系统,hadoop用于分布式存储和map-red ...
- JDK替换掉系统自带的gij编译工具
解决办法: 在终端里面依次输入以下两句话 alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_11/bin/java 300 al ...
- 微信公众号对接JS-SDK接口 调用微信内置地图
微信js-sdk开发文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html 1.页面配置 引用微信js- ...
- C#中使用HttpClient来Post数据的内容HttpContent的各种格式
平时使用各种网络传输的时候基本上是以Json格式进行的, 所以对其他几种格式也是一知半解, 今天静下心对其好好梳理一番. 首先我借鉴了一篇文章(https://segmentfault.com/a/1 ...