天天看點

Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分别是做什麼的?有什麼差別?

Hibernate的對象有三種狀态:瞬時态(transient)、持久态(persistent)和遊離态(detached),如第135題中的圖所示。瞬時态的執行個體可以通過調用save()、persist()或者saveOrUpdate()方法變成持久态;遊離态的執行個體可以通過調用 update()、saveOrUpdate()、lock()或者replicate()變成持久态。save()和persist()将會引發SQL的INSERT語句,而update()或merge()會引發UPDATE語句。save()和update()的差別在于一個是将瞬時态對象變成持久态,一個是将遊離态對象變為持久态。merge()方法可以完成save()和update()方法的功能,它的意圖是将新的狀态合并到已有的持久化對象上或建立新的持久化對象。對于persist()方法,按照官方文檔的說明:① persist()方法把一個瞬時态的執行個體持久化,但是并不保證辨別符被立刻填入到持久化執行個體中,辨別符的填入可能被推遲到flush的時間;② persist()方法保證當它在一個事務外部被調用的時候并不觸發一個INSERT語句,當需要封裝一個長會話流程的時候,persist()方法是很有必要的;③ save()方法不保證第②條,它要傳回辨別符,是以它會立即執行INSERT語句,不管是在事務内部還是外部。至于lock()方法和update()方法的差別,update()方法是把一個已經更改過的脫管狀态的對象變成持久狀态;lock()方法是把一個沒有更改過的脫管狀态的對象變成持久狀态。