entityManager 的常用方法(一)

2021-08-16 04:35:15 字數 2646 閱讀 3747

理解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自行判斷 更新的資料才...