代码
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=?";
......
--------------------------------------------------------------------
hibernate中inverse的用法 收藏
一、Inverse是hibernate双向关系中的基本概念。inverse的真正作用就是指定由哪一方来维护之间的关联关系。当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系,说白了就是hibernate如何生成Sql来维护关联的记录!
二、Inverse和Cascade的比较
Inverse:负责控制关系,默认为false,也就是关系的两端都能控制,但这样会造成一些问题,更新的时候会因为两端都控制关系,于是重复更新。一般来说有一端要设为true。
Cascade:负责控制关联对象的级联操作,包括更新、删除等,也就是说对一个对象进行更新、删除时,其它对象也受影响,比如我删除一个对象,那么跟它是多对一关系的对象也全部被删除。
举例说明区别:删除“一”那一端一个对象O的时候,如果“多”的那一端的Inverse设为true,则把“多”的那一端所有与O相关联的对象外键清空;如果“多”的那一端的Cascade设为Delete,则把“多”的那一端所有与O相关联的对象全部删除。