>>分享JPA、Hibernate、Mybatis对象持久化技术,对《精通JPA与Hibernate:Java对象持久化详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 23447 个阅读者 刷新本主题
 * 贴子主题:  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网络编程-->用Axis发布Web服务
  精通Spring-->通过Axios访问服务器
  Vue3开发-->绑定CSS样式
  什么是XA事务
  Spring JPA 使用注解方式进行事务管理
  十分钟入门 JPA
  推荐:Spring,JPA与Hibernate的最新整合范例讲解(孙卫琴主讲...
  好消息:孙卫琴老师制作的最新JPA与Hibernate视频教程出炉了
  用CriteriaBuilder进行动态查询
  JPA Criteria查询入门
  Hibernate的Enver用法指南
  Hibernate ORM 5.3.9.Final 发布,常规更新版本
  JPA EntityManager类的常用方法的作用
  JPQL与SQL的区别
  JP注解(标注)和Hibernate注解(标注) 用法详解
  Hibernate的save()和persist()方法的区别
  Hibernate Session和JPA的EntityManager的对应关系
  在看孙老师的hibernate书。。。
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


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