>>分享JPA、Hibernate、Mybatis对象持久化技术,对《精通JPA与Hibernate:Java对象持久化详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 23515 个阅读者 刷新本主题
 * 贴子主题:  JPA EntityManager find和getReference方法异同 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-02-20 06:24:45     消息  查看  搜索  好友  邮件  复制  引用

find (Class entityClass,Object primaryKey):
返回指定的 OID 对应的实体类对象,如果这个实体存在于当前的持久化环境,则返回一个被缓存的对象;否则会创建一个新的 Entity, 并加载数据库中相关信息;若 OID 不存在于数据库中,则返回一个 null。第一个参数为被查询的实体类类型,第二个参数为待查找实体的主键值。

getReference (Class entityClass,Object primaryKey):
与find()方法类似,不同的是:如果缓存中不存在指定的 Entity, EntityManager会创建一个 Entity 类的代理,但是不会立即加载数据库中的信息,只有第一次真正使用此 Entity 的属性才加载,所以如果此 OID 在数据库不存在,getReference() 不会返回 null 值, 而是抛出EntityNotFoundException

find:
类似于Hibernate get方法
    @Test
    public void testFind(){
        EntityManagerFactory factory;
        EntityManager manager;
        factory = Persistence.createEntityManagerFactory("JPA");
        manager = factory.createEntityManager();

        Customer customer = manager.find(Customer.class, 1);
        System.out.println("--------------------");
        System.out.println(customer);

        manager.close();
        factory.close();
    }

Hibernate生成的SQL语句:

select
customer0_.ID as ID1_0_0_,
customer0_.Age as Age2_0_0_,
customer0_.Email as Email3_0_0_,
customer0_.Name as Name4_0_0_
from
CUSTOMERS customer0_
where
customer0_.ID=?

--------------------
Customer [id=1, name=张三, email=null, age=15]

getReference:懒加载
类似于Hibernate load方法,代理 懒加载,存在懒加载异常


    @Test
    public void testGetReference(){
        EntityManagerFactory factory;
        EntityManager manager;
        factory = Persistence.createEntityManagerFactory("JPA");
        manager = factory.createEntityManager();

        Customer customer = manager.getReference(Customer.class, 1);
        System.out.println("--------------------");
        System.out.println(customer);

        manager.close();
        factory.close();
    }

Hibernate生成的SQL语句:

    select customer0_.ID as ID1_0_0_, customer0_.Age as Age2_0_0_, customer0_.Email as Email3_0_0_, customer0_.Name as Name4_0_0_ from CUSTOMERS customer0_ where customer0_.ID=? Customer [id=1, name=张三, email=null, age=15]

总结:
  • find:直接查询,不管是否立即使用,类似于hibernate get方法
  • getReference:实际先返回一个代理对象,等需要使用时,再进行查询,懒加载模式,类似于hibernate load方法,可能抛出懒加载异常
  • 懒加载异常: 在使用对象前关闭连接,由于对象实际是一个代理对象,在使用时将抛出懒加载异常
转自:   http://blog.csdn.net/rickesy/article/details/50788324  



程序猿的技术大观园:www.javathinker.net

[这个贴子最后由 flybird 在 2020-02-23 10:52:38 重新编辑]
  Java面向对象编程-->类的生命周期
  JavaWeb开发-->访问数据库(Ⅰ)
  JSP与Hibernate开发-->数据库事务的概念和声明
  Java网络编程-->用Swing组件展示HTML文档
  精通Spring-->组合(Composition)API
  Vue3开发-->通过Axios访问服务器
  分布式事务浅析及简单实现
  孙卫琴的Java对象持久化技术之旅-视频讲座
  孙卫琴的《精通JPA与Hibernate》的读书笔记:持久化层对象的...
  孙卫琴的《精通JPA与Hibernate》的读书笔记: 用JPQL批量处理...
  理解事务的四种隔离级别
  征求意见:正在写一本新书《精通JPA与Hibernate》
  EntityManager接口的find()方法和getReference()方法的区别
  Hibernate的二级缓存
  Hibernate ORM 5.3.9.Final 发布,常规更新版本
  JPA EntityManager类的常用方法的作用
  JPA/Hibernate:基于版本的乐观锁并发控制
  Hibernate的save()和persist()方法的区别
  Hibernate5源码解析:SessionFactroy的创建过程
  Spring Hibernate5入门
  精典:Hibernate5官方用户手册 中文版免费下载
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。