java 代码
- 建议大家好好去看一下这个链接,讲的很详细,虽然是E文,可并不难懂。
- http://www.hibernate.org/155.html
- 这篇文章里没有提到delete的情况,我就one-to-many来做个简单说明:
- 代码
- 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=?";
- ......