session.beginTransaction();
Person p = new Person("王三", 22, "男", "北京");
session.save(p); // 1
session.delete(p); // 2
p.setId(null);
session.save(p); // 3
session.getTransaction().commit();
控制台 SQL 順序:
INSERT ... -- save(p) 第1次
DELETE ... -- delete(p)
INSERT ... -- save(p) 第2次
疑問:Hibernate 不是延遲執行、按「INSERT 先於 DELETE」排序嗎?
Hibernate Session 內部維護 **Action Queue**,不同操作對應不同 Action 類型,執行優先級固定:
**但**優先級僅決定**同類實體**的排序。**同一實體實例**的多次操作,**按代碼調用順序**入隊,flush 時**按入隊順序**執行。
save(p) → 入隊 InsertAction(p 為 transient,賦予 ID)。delete(p) → 入隊 DeleteAction(p 現為 persistent)。setId(null) + save(p) → p 變回 transient,**新增**一個 InsertAction(視為新實體)。setId(null) 將持久化對象變為臨時態,**極不推薦**;應新建對象:Person p2 = new Person(...)。session.evict(p) 後新建對象。