![](/img/trans.png)
[英]When to use EntityManager.find() vs EntityManager.getReference() with JPA
[英]What is the difference between EntityManager.find() and EntityManger.getReference()?
什么是區別
<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刪除方法'什么是更好更正確的選項? 找到還是得到參考?'
正如您所知,JPA具有EntityManager的概念。 在您在實體管理器中工作期間,某些對象從數據庫加載,可以進行修改,然后刷新到數據庫。
find()
必須返回對象的初始化實例。 如果它尚未加載到EntityManager中,則從數據庫中檢索它。
如果之前尚未在EntityManager中加載實體,則允許getReference()
返回代理而不是初始化實例。 在此代理中,僅初始化主鍵屬性。 可以在不命中數據庫的情況下創建代理,因為已經為getReference()函數提供了唯一的初始化屬性。
如果您有一個實體A引用實體B,並且您希望將A的b屬性設置為B,而不必從數據庫中加載B,則后者非常有用。
僅當您引用B的其他屬性時,才會初始化代理。
getReference()
不檢索完整對象而只檢索代理,因此如果不訪問對象的成員,則可以更有效。
例如,在創建要插入數據庫的新對象時,可能必須引用已存儲在數據庫中的另一個對象。
要使JPA正確存儲新對象,只需要引用對象的主鍵。 通過使用getReference()
您將獲得包含主鍵的代理,並節省加載整個對象的成本。
“ 使用GlassFish 3開始Java EE 6平台 ”一書,請參閱第135頁中的差異:“按ID查找”
find()
如果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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.