session.delete(obj)將obj的狀態變為transient。兩種情況
1)obj是session的cache里邊的cache沒有的,比如:
session.delete(new Employee(4));
2)obj存在于session的cache中,比如:
Employee employee = (Employee)session.load(Employee.class, new Integer(4));
session.delete(employee);
這兩種情況都是允許的,hibernate都會發送一條delete語句給數據庫。
delete執行之后,如果調用了session.load(), 又可以分為兩種情況:1)在session.flush()之前,如:
tx.beginTransaction();
session.delete(new Employee(4));
session.load(Employee.class, new Integer(4));//發生在session.flush()之前
tx.commit();
那么hibernate會拋出ObjectDeletedException:The object with that id was deleted:
2)在session.flush()之后,如:
tx.beginTransaction();
session.delete(new Employee(4));
session.load(Employee.class, new Integer(4));
tx.commit();
tx.beginTransaction();
session.load(Employee.class, new Integer(4));//同一個session中,上面的tx.commit()將session flush了一次。
tx.commit();
那么這個時候hibernate僅僅會拋出ObjectNotFoundException:No row with the give...
表示找不到該object。如果第二個tx里邊采用session.get()也就不會拋出exception了。
delete執行之后,如果調用了session.save(obj):
tx.beginTransaction();
Employee employee = (Employee)session.load(Employee.class, new Integer(4));
session.delete(employee);
System.out.println(employee);
session.save(employee);
System.out.println(employee);
tx.commit();
這種情況是完全合理的,合法的。
delete將employee從persistent的狀態變為transient的狀態。
save將employee從transient狀態變為persistent的狀態。save一個被delete的obj的時候,在save處hibernate強制執行session.flush(),發送delete語句,然后按照常規的save流程來進行。為什么要這么做,還沒有完全想明白。
delete執行之后,如果對obj對象屬性的修改,tx.commit()時不會進行dirtyChecking。 這個道理比較顯然。