欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-16 21:26:09
场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi ......

场景

jpa入门简介与搭建helloworld(附代码下载):

https://blog.csdn.net/badao_liumang_qizhi/article/details/103473937

注:

博客主页:

关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

find

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

getreference

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

单元测试

测试find方法

@test
public void testfind() {
 customer customer = entitymanager.find(customer.class, 3);
 system.out.println("-------------------------------------");
  
 system.out.println(customer);
}

 

测试结果

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

测试getreference方法

@test
public void testgetreference(){
 customer customer = entitymanager.getreference(customer.class, 3);
 system.out.println(customer.getclass().getname());  
 system.out.println("-------------------------------------");  
 system.out.println(customer);
}

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

 

通过上面的测试可知

find方法类似于hibernate中session的get方法。

getreference方法类似于hibernate的session的load方法。

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