这篇文章里没有提到delete的情况,我就one-to-many来做个简单说明:
- Parent parent = (Parent); session.load(Parent.class, pid);;
- session.delete(parent);;
Parent parent = (Parent); session.load(Parent.class, pid);;
session.delete(parent);;
1. 爸爸那边设置了cascade=all和inverse=true
a. delete from children
b. delete from parent
2. 爸爸那边设置了cascade=all,没有设inverse=true
a. update children set parent_id=null where parent_id=?
b. delete from children
c. delete from parent
因为此时inverse=false,所以爸爸要负责维护relationship,所以它要去把children中的连接信息都清空。但是,如果children的parent_id的constraint设置的是not-null的话,那么很不幸,hibernate执行到2.a就会throw exception了。
如果你要问,这个inverse=true到底是在源代码中的哪儿判断的呀?请看代码:
- ......
- SessionImpl.flush();;
- SessionImpl.execute();;
- SessionImpl.executeAll(collectionRemovals);;
- executable.execute();;
- ScheduledCollectionRemove.execute();;
- getPersister();.remove( getId();, getSession(); );;
- OneToManyPersister(即AbstractCollectionPersister);.remove();;
- if ( !isInverse ); {
- PreparedStatement st = session.getBatcher();.prepareBatchStatement( getSQLDeleteString(); );;
- }
- OneToManyPersister.getSQLDeleteString();;
- return "update children set parent_id=null where parent_id=?";
- ......