什么是
之间的区别<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?'
答案 0 :(得分:72)
正如您所知,JPA具有EntityManager的概念。在实体管理器中工作期间,一些对象从数据库加载,可以修改,然后刷新到数据库。
find()
必须返回对象的初始化实例。如果它尚未加载到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
}