>>分享JPA、Hibernate、Mybatis对象持久化技术,对《精通JPA与Hibernate:Java对象持久化详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 32939 个阅读者 刷新本主题
 * 贴子主题:  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开发-->面向对象开发方法概述之UML语言(下)
  JSP与Hibernate开发-->Web运作原理(Ⅲ)
  Java网络编程-->JSP中使用JavaBean(Ⅱ)
  精通Spring-->Java Web项目实战:开发商业购物网站
  Vue3开发-->通过JPA API检索数据
  分布式事务浅析及简单实现
  孙卫琴的《精通JPA与Hibernate》的读书笔记:JPA的配置文件
  Spring JPA 使用注解方式进行事务管理
  用注解和XML描述对象-关系映射的区别,和优缺点
  征求意见:正在写一本新书《精通JPA与Hibernate》
  JPA @Convert注解的用法
  Session的refresh()方法与事务隔离级别的关系
  JPA EntityManager类的常用方法的作用
  JPQL与SQL的区别
  JP注解(标注)和Hibernate注解(标注) 用法详解
  JPA API入门
  Hibernate 对象-关系映射: @注解与xml 配置方式比较
  JPA (Java Persistence API)2.2 的一些新特性
  Hibernate 5的新特性
  在看孙老师的hibernate书。。。
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


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