EntityManager的find()与getReference()的区别

(2010-03-09 21:18:23)

转载▼
  分类: EJB

先说相同点

这两个方法都接受实体的 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 second argument is not a valid type for that entity's primary key

不同点:

find()返回指定OID的实体,如果这个实体存在于当前的persistence context中,那么返回值是被缓存的对象;否则会创建一个新的实体,并从数据库中加载相关的持久状态。如果数据库不存在指定的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.lazyinitializationexception could not initialize proxy no session

因此将一个新的实体传递给事务的时候通常使用find()方法,而当不连接数据库,不使用getter方法,即使用setter方法改变状态时才使用getReference()方法。(这是由于getReference返回是一个Proxy实体,即没有加载持久状态)

某些场合下使用getReference()方法可以避免从数据库加载持久状态的性能开销。

这也完全是由于getReference返回是一个Proxy实体.

比如一个简单的update操作,先使用find()获取实体,而后使用实体的setter方法;或者是getReference()方法,而后使用实体的setter方法。

对于前者JPA调用的SQL:select ****,而后才是update ****

对于后者:仅为update *****

又如:

操作                                                                            执行的SQL

em.remove(em.getReference(Person.class,1))         delete from Person where personid = 1

em.remove(em.find(Person.class,1))                 select * from Person where personid =1

delete from Person where personid =1

由此可以看出,find()做了一次select的操作,而getReference并没有做有关数据库的操作,而是返回一个代理,这样它就减少了连接数据库和从数据库加载持久状态的开销。

引用出处:http://blog.csdn.net/whw1984/archive/2009/09/06/4524449.aspx

EntityManager的find()与getReference()的区别相关推荐

  1. JPA性能方法------EntityManager的find()与getReference()的区别

    相同点 这两个方法都接受实体的class和代表实体主键的对象作为参数.由于它们使用了Java泛型方法,无需任何显示的类型转换即可获得特定类型的实体对象.其中,在primaryKey上面普遍使用了jav ...

  2. JPA的entityManager的find、getReference、persisit、remove方法的使用

    场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...

  3. 一步步实现:JPA的基本增删改查CRUD(jpa基于hibernate)

    1.创建一个JPA工程 首先,创建一个JPA工程(若不知道JPA创建或出现at least one user library must be selected等错误,请参考http://blog.cs ...

  4. hibernate 和 jpa简介

    hibernate 和 jpa简介 小引 什么是ORM思想? Hibernate概述 JPA概述 hibernate 和 jpa的关系 jpa的常用对象 JPA中的主键生成策略 JPA的入门案例 配置 ...

  5. JPA的entityManager的find方法与getReference方法的区别

    场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...

  6. SpringDataJPA+Hibernate框架源码剖析(六)@PersistenceContext和@Autowired注入EntityManager的区别

    SpringDataJPA+Hibernate框架源码剖析系列文章: SpringDataJPA+Hibernate框架源码剖析(一)框架介绍 SpringDataJPA+Hibernate框架源码剖 ...

  7. Spring-Data-JPA EntityManager 从一次线上BUG探究Autowired和PersistenceContext的区别

    文章目录 背景 SessionImpl VS SharedEntityManagerCreator$SharedEntityManagerInvocationHandler Qualifier匹配注入 ...

  8. @PersistenceContext和@Autowired在EntityManager上应用的区别。

    在使用SpringJPA的时候,经常看到如下代码: @PersistenceContext private EntityManager entityManager; 于是就有些好奇,这个@Persis ...

  9. Java文档阅读笔记-JPA中getOne()和findById的区别

    findById()和getOne()都是从数据库中检索某个对象,不过获取数据的方式是不同的,getOne()是lazy操作,这种操作甚至没有访问数据库. getOne() 返回ID的引用对象,他内部 ...

最新文章

  1. [综合面试] 计算机面试书籍与求职网站推荐
  2. 怎样只接受固定长度数组为参数 数组形参
  3. 我一直怀疑这孩子不是我亲生的,眼神太二了
  4. Python 实现类似sed命令的字符串替换小程序
  5. C段 192.168.1.15/28与192.168.1.16/28的区别
  6. [python爬虫] 招聘信息定时系统 (一).BeautifulSoup爬取信息并存储MySQL
  7. iMac建立到服务器的反向ssh
  8. javaweb学习总结(九):通过Servlet生成验证码图片
  9. spring框架mvc框架_Spring MVC测试框架入门–第2部分
  10. CentOS x86_64系统手动释放内存
  11. SolarWinds 事件新动态:研究员发现新的C2基础设施
  12. WLC-生成CSR操作
  13. eclipse 无法启动选择的项,最近未进行任何启动
  14. PostgreSQL创建数据库用户
  15. 一个好用的在线java反编译工具
  16. java的property_「propertyutils」java之PropertyUtils - seo实验室
  17. 智能合约语言 Solidity 教程系列2 - 地址类型介绍
  18. smtp服务器发送邮件的工作原理,SMTP协议工作原理及服务.doc
  19. 如何用Vegas制作故障特效
  20. Just Like Heaven

热门文章

  1. mac关闭VPN之后,浏览器就不能够正常上网了(图解)
  2. 暑期python培训价格
  3. feek()、ftell()和rewind()用法
  4. Java-可变对象和不可变对象介绍
  5. 有哪些手游的账号卖了值钱?
  6. android系统语言切换及系统烧写默认语言设置
  7. python实现求解完美立方等式
  8. 谈谈后端业务系统的微服务化改造
  9. nodename nor servname provided的解决
  10. asp毕业设计——基于asp+access的档案管理系统设计与实现(毕业论文+程序源码)——档案管理系统