>>分享JPA、Hibernate、Mybatis对象持久化技术,对《精通JPA与Hibernate:Java对象持久化详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 23514 个阅读者 刷新本主题
 * 贴子主题:  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技术详解(Ⅰ)
  JSP与Hibernate开发-->Java对象持久化技术概述
  Java网络编程-->创建非阻塞的HTTP服务器
  精通Spring-->Vue组件开发高级技术
  Vue3开发-->计算属性和数据监听
  孙卫琴的《精通JPA与Hibernate》的读书笔记:持久化层对象的...
  孙卫琴的《精通JPA与Hibernate》的读书笔记:在程序中动态指定...
  Hibernate使用中防止SQL注入的几种方案
  JPA EntityManager详解
  理解事务的四种隔离级别
  Hibernate中通过FetchProfile的方式实现动态数据获取
  JPA @Convert注解的用法
  Hibernate的Enver用法指南
  Session的refresh()方法与事务隔离级别的关系
  Hibernate的八种对象标识符生成策略
  JPQL与SQL的区别
  Hibernate的save()和persist()方法的区别
  Hibernate Session和JPA的EntityManager的对应关系
  Hibernate配置文件中的hibernate.hbm2ddl.auto属性详解
  总结Hibernate5的新特性
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


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