EntityManager.find()和EntityManager.getReference()之间有什么区别?

时间:2011-03-30 05:13:12

标签: java jpa entitymanager

什么是

之间的区别
<T> T EntityManager.find(Class<T> entityClass, Object primaryKey) and 
<T> T EntityManager.getReference(Class<T> entityClass, Object primaryKey) 

我认为getReference会在管理时返回实体。 并且如果它被管理则查找返回实体,否则在数据库上执行SQL以使其被管理。

请确认。


上下文: 从webapp我得到要删除的对象的主键(pk类型为long);应该设法删除实体。

EntityManager.remove(Object entity)

将托管实体传递给entitymanager删除方法'什么是更好更正确的选项? find或getReference?'

3 个答案:

答案 0 :(得分:72)

正如您所知,JPA具有EntityManager的概念。在实体管理器中工作期间,一些对象从数据库加载,可以修改,然后刷新到数据库。

find()必须返回对象的初始化实例。如果它尚未加载到EntityManager中,则从数据库中检索它。

如果之前尚未在EntityManager中加载实体,则允许

getReference()返回代理而不是初始化实例。在此代理中,仅初始化主键属性。 可以在不命中数据库的情况下创建代理,因为已经为getReference()函数提供了唯一的初始化属性。

当您有一个引用实体B的实体A,并且您想要将A的b属性设置为B时,后者非常有用,而无需从数据库中加载B.

仅当您引用B的其他属性时,才会初始化代理。

答案 1 :(得分:8)

getReference()不检索完整对象,而只检索代理,因此如果您不访问对象的成员,则效率更高。

例如,在创建要插入数据库的新对象时,可能必须引用已存储在数据库中的另一个对象。

要使JPA正确存储新对象,只需要引用对象的主键。 通过使用getReference(),您将获得包含主键的代理,并节省加载整个对象的成本。

答案 2 :(得分:7)

本书Beginning Java EE 6 Platform with GlassFish 3,请参阅第135页的差异:“按ID查找”

find()如果找到该实体,则返回该实体;如果未找到,则返回空值。

MyEntity obj = em.find(MyEntity.class, id);
if(obj != null){
   // Process the object 
}

getReference()适用于需要托管实体实例但无法访问实体主键的数据的情况。

try {
    MyEntity obj = em.getReference(MyEntity.class, id);
    // Process the object
} catch (EntityNotFoundException e) {
    // Entity Not Found
}