簡體   English   中英

EntityManager.find()和EntityManger.getReference()之間有什么區別?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM