2 回答

TA貢獻1871條經(jīng)驗 獲得超13個贊
要理解這個問題,您需要對 Hibernate Object Lifecycle 有所了解。
Hibernate 對象生命周期由以下狀態(tài)組成:1. 瞬態(tài)狀態(tài) 2. 持久狀態(tài) 3. 分離狀態(tài)等
當(dāng)您創(chuàng)建一個新對象時,它處于瞬態(tài),Hibernate 無法檢測在瞬態(tài)中存在/創(chuàng)建的對象。
當(dāng)您調(diào)用時save()
saveOrUpdate()
,對象從瞬態(tài)狀態(tài)移動到持久狀態(tài),現(xiàn)在 Hibernate 將開始跟蹤對對象所做的所有更改(但對象尚未寫入數(shù)據(jù)庫)。
因此,在您的情況下,由于對象未處于持久狀態(tài),因此 hibernate 無法識別它并將觸發(fā)(最有可能)insert
查詢。但是,如果對象已經(jīng)處于持久狀態(tài),hibernate 會知道某些字段已修改,因此將觸發(fā)update
查詢。
這就是為什么如果您希望休眠來觸發(fā)update
查詢,您需要確保對象處于持久狀態(tài)。

TA貢獻1829條經(jīng)驗 獲得超13個贊
這意味著事務(wù)尚未完成,所有更改僅在緩存中。要強制更新,您可以調(diào)用entityManager.flush()
或移動您需要的所有邏輯到另一個服務(wù)或管理器的單獨公共方法中,并將其注釋為@Transactional
添加回答
舉報