JPA性能方法------EntityManager的find()与getReference()的区别
相同点
这两个方法都接受实体的class和代表实体主键的对象作为参数。由于它们使用了Java泛型方法,无需任何显示的类型转换即可获得特定类型的实体对象。其中,在primaryKey上面普遍使用了java5的autoboxing(自动装箱)的特性。
再者,就是两者都会在EntityManager关闭的情况下抛出IllegalStateException
-if this EntityManager has been closed.在传入的第一个参数不是实体或者第二个参数不是一个有效的主键的情况下抛出
IlegalArgumentException
-if the first argument does not denote an entity type or the secondargument is not a valid type for that entity's primary key
不同点:
find()返回指定OID的实体,如果这个实体存在于当前的persistencecontext中,那么返回值是被缓存的对象;否则会创建一个新的实体,并从数据库中加载相关的持久状态。如果数据库不存在指定的OID的记录,那么find()方法返回null。
getReference()方法和find()相似。不同的是:如果缓存中没有指定的实体,EntityManager会创建一个新的实体,但是不会立即访问数据库来加载持久状态,而是在第一次访问某个属性的时候才加载。此外,getReference()方法不返回null,如果数据库找不到相应的实体,这个方法会抛出javax.persistence.EntityNotFoundException。
EntityNotFoundException
-if the entity state cannot be accessed
某些场合下使用getReference()方法可以避免从数据库加载持久状态的性能开销。
补充:
如果缓存中没有指定的实体,EntityManager会创建一个新的实体,但是不会立即访问数据库来加载持久状态,而是在第一次访问某个属性的时候才加载。
比如,em.find()返回的实体,我们就可以对它进行各种操作,而若对em.getReference()返回的实体,由于不会立即访问数据库来加载持久状态,对它进行的操作很可能就会出现Exception,比如在对它返回的实体做getter操作时,由于EntityManager对此采用延时加载,就会抛出org.hibernate.lazyinitializationexceptioncould not initialize proxy no session
因此将一个新的实体传递给事务的时候通常使用find()方法,而当不连接数据库,不使用getter方法,即使用setter方法改变状态时才使用getReference()方法。(这是由于getReference返回是一个Proxy实体,即没有加载持久状态)
JPA性能方法------EntityManager的find()与getReference()的区别相关推荐
- EntityManager的find()与getReference()的区别
EntityManager的find()与getReference()的区别 (2010-03-09 21:18:23) 转载▼ 分类: EJB 先说相同点 这两个方法都接受实体的 class和代 ...
- jpa 托管_JPA EntityManager详解(一)
持久化上下文(Persistence Contexts)的相关知识,内容包括如何从Java EE容器中创建EntityManager对象.如何从Java SE中创建EntityManager对象.持久 ...
- Spring Data JPA 查询方法的命名语法与参数
3 Spring Data JPA 查询方法的命名语法与参数 在⼯作中,你是否经常为⽅法名的语义.命名规范⽽发愁?是否要为不同的查询条件写各种的 SQL 语句?是否为同⼀个实体的查询,写⼀个超级通⽤的 ...
- Linux下环境变量配置方法梳理(.bash_profile和.bashrc的区别)
博客园 首页 新随笔 联系 管理 订阅 <div class="blogStats"><!--done--> 随笔- 556 文章- 38 评论- 77 ...
- 《.NET程序员面试秘笈》----面试题8 方法的重载和override有什么区别
本节书摘来自异步社区<.NET程序员面试秘笈>一书中的第1章,面试题8,作者: 张云翯, 更多章节内容可以访问云栖社区"异步社区"公众号查看. 面试题8 方法的重载和o ...
- [react] 在react中遍历的方法有哪些?它们有什么区别呢?
[react] 在react中遍历的方法有哪些?它们有什么区别呢? 有React.Children.map和 React.Children.forEach这两个方法,他们的参数都是在组件中接受prop ...
- left join 和join区别_sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇
Object中的wait.notify.notifyAll,可以用于线程间的通信,核心原理为借助于监视器的入口集与等待集逻辑 通过这三个方法完成线程在指定锁(监视器)上的等待与唤醒,这三个方法是以锁( ...
- Golang 方法接收者为值与指针的区别
文章目录 1.方法语法格式 2.方法接收者为值与指针的区别 3.小结 参考文献 1.方法语法格式 Golang 中同时有函数和方法.方法是一个包含了接收者(receiver)的函数,receiver ...
- a卡 n卡 html5性能,A卡和N卡之间的区别,原来是这样!
作者| Vigor Net编辑器 我不打算再写有关图形卡的文章. 上周,我们的客户服务员报告说,一个小伙伴说,他们要求写一个阶段的A卡(AMD显卡,以前属于ATI,并被AMD收购)和N卡(NVIDIA ...
最新文章
- 当安卓 Emoji 遇上苹果 Emoji:傻傻分不清楚
- Center OS 5.5 下安装 和 配置 Tomcat 7
- python pdf-浅谈Python处理PDF的方法
- 《系统集成项目管理工程师》必背100个知识点-12项目整体管理的过程
- 在Ubuntu 16.04 LTS下编译安装OpenCV 4.1.1
- (十五) 构建springmvc+mybatis+dubbo分布式平台-window安装dubbo管控台
- SpringBoot配置Profile以及配置文件的加载位置
- pandas重采样时指定对不同列的不同操作
- a king读后感 love of the_A华语电影高清合集
- Elasticsearch(待学习)
- 夺标查询和联合查询有什么区别么
- 计算机控制系统步进电机,步进电机计算机控制系统设计.doc
- STEAM 教育相关书籍
- python判断生肖
- 【2022年】安装vm虚拟机unbuntu 服务器版
- CSS超出两行隐藏,但是仍然有部分第三行文字溢出
- 蜜蜂在挡板外和框梁顶造赘脾的几个要素及处理方法
- µTorrent中只使用ipv6连接
- 前端开发:JS中截取字符串的用法总结
- 数据结构与算法实验 实验6:二叉树ADT的二叉链式实现 (由完全前序序列创建二叉树 / 求二叉树的节点数/树高/叶子节点数 /先序中序后序层序遍历)
热门文章
- C# Cefsharp 的使用(Google浏览器)
- Android开发各种Utils收集库
- Opencv——视频跳帧处理
- 2020年8月20计算机大赛,NOI2020于8月17日正式开幕!今年哪些竞赛选手被保送清北计算机专业?...
- JAVA中关于可变和不可变类型的理解
- 刷题总结——松鼠的新家(bzoj3631)
- java雷霆战机小游戏(git 素材+代码)
- zz 0ffice 2007 something.....
- javaweb 项目打包部署教程
- 海思Hi3559(十)——生成wk数据文件