|
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 重新编辑]
|
|