理解eneitymanager的這三個方法的作用和區別,首先需要分清楚persistencecontext 和 entitymanager.
persistencecontext:是entity的乙個例項。
entitymanager:是和persistencecontext聯絡在一起的,被用來建立、刪除或者查詢乙個持久化entity例項。
換句話來說persistencecontext可以說成是資料庫的快取。entitymanager的操作針對的都是整個實體,所以才叫實體管理器。
針對單個欄位的操作使用createquery,createnativequery
hql,jpql,sql的使用不存在持久化上下文的快取問題,即不適用session一級快取???如果查到的結果封裝到乙個物件裡則還是會在一級快取中
1.merge
通過entitymanager將乙個存在的實體「同步到」persistencecontext中。
實體的狀態將從其單獨的狀態轉換為受persistencecontext管理的狀態。
如果entity是新建立的,則這個方法類似於persist()這個方法。
如果entity已經存在的,則只作為更新操作。
@test
@transactional
public
void
testjpa()
merge
方法的主要作用是將使用者對乙個
detached
狀態實體的修改進行歸檔,歸檔後將產生乙個新的
managed
狀態物件。
對不同狀態下的例項a,
merge
會產生以下操作:1)
如果a是乙個detached
狀態的實體,該方法會將
a的修改提交到資料庫,並返回乙個新的
managed
狀態的例項a2;
2)如果
a是乙個
new狀態的實體,該方法會產生乙個根據
a產生的
managed
狀態實體
a2 ;
3)如果
a是乙個
managed
狀態的實體,它的狀態不會發生任何改變。但是系統仍會在資料庫執行
update
操作;4)如果a
是乙個removed
狀態的實體,該方法會丟擲
illegalargumentexception
異常2.flush
將persistencecontext的資訊同步到資料庫中。
當觸發flush這個動作的時候,所有的實體都將會被insert/update/remove到資料庫中。
資料庫不會觸發commit的操作。
3.refresh
refresh的作用是從資料庫中將entity的狀態進行更新操作。如果entity和資料庫中的資料不一致,將更新資料庫中的資料到entity中。即refresh操作只針對受託管狀態(在persistencecontext中的物件)有效。
這種情況一般發 生在你獲取了實體之後,有人更新了資料庫中的記錄,這時你需要得到最新的資料
1)如果
a是乙個
new狀態的例項,不會發生任何操作,但有可能會丟擲異常,具體情況根據不同
jpa實現有關;
2)如果
a是乙個
managed
狀態的例項,它的屬性將會和資料庫中的資料同步;
3)如果
a是乙個
removed
狀態的例項,不會發生任何操作;4
)如果a是乙個
detached
狀態的實體,該方法將會丟擲異常
remove
方法可以將實體轉換為
removed
狀態,並且在呼叫
flush()
方法或提交事物後刪除資料庫中的資料。
對不同狀態下的例項a,
remove
會產生以下操作:1)
如果a是乙個new
狀態的例項,
a的狀態不會發生任何改變,但系統仍會在資料庫中執行
delete
語句;2)如果a
是乙個managed
狀態的例項,它的狀態會轉換為
removed;3
)如果a
是乙個removed
狀態的例項,不會發生任何操作;4)
如果a是乙個detached
狀態的實體,該方法將會丟擲異常。
總結:
merger 將游離態修改並使之成為託管態,主要用於update操作,詳見jpa update說明
flush 將託管態物件更新到資料庫,但是沒有執行commit,即沒有提交事物
refresh 將託管態物件更新為db中的最新狀態
persist 將臨時態(即新new的物件,主鍵id為null)轉化為託管態
remove 將託管態變為刪除狀態,即用該方法執行刪除操作要先查庫,再刪除,如下
user user=em.find(user.class,"uuid");
em.remove(user);
JPA的EntityManager類的常用方法
返回指定的oid 對應的實體類物件,如果這個實體存在於當前的持久化環境,則返回乙個被快取的物件 否則會建立乙個新的 entity,並載入資料庫中相關資訊 若 oid 不存在於資料庫中,則返回乙個 null。第乙個引數為被查詢的實體類型別,第二個引數為待查詢實體的主鍵值。與find 方法類似,不同的是...
使用EntityManager操作實體
顧名思義,實體管理器entitymanager是負責管理entity的物件。對entity的操作包括新增 刪除 修改和查詢,都是通過實體管理器來實現的。在ejb容器中,entitymanager的獲得可以通過標註,使用依賴注入來建立entitymanager例項,如下所示。persistenceco...
EntityManager常用API簡單備忘
1 find getreference 獲得實體,類似getbyid。2 persist 將資料儲存到資料庫中,傳遞的引數必須是實體bean,類似insert。3 當實體正在被容器管理時,你可以呼叫實體的set方法對資料進行修改,在容器決定flush時 這個由container自行判斷 更新的資料才...