Hibernate中cascade与inverse

阅读更多
cascade:
     当Hibernate持久化一个"自由态对象"时,在默认的情况下(没有设置cascade或cascade=none时),Hibernate不会自动持久化他所关联的其他临时对象。在cascade="save-update"或者cascade="all"时,当Hibernate向数据库表中插入"新"对象记录时,会检查该对象所关联的属性是否发生变化,如果发生变化,就按照级联属性(cascade)所设定的内容进行操作。

如一个person类和一个QQ类,他们是one-to-many的关系。person类中qqs属性对应配置文件set的cascade属性设为cascade="save-update"。
Person p = new Person();
p.setName("zhangsan");

QQ qq = new QQ();
qq.setNum("1111");
qq.setPerson(p);

p.getQqs().add(qq);

getSession().save(p);


inverse
     在Hibernate执行getSession().save(p)这段代码时通过show_sql开启显示sql语句功能,那么控制台将会显示3条sql语句。
     第一条是将新的数据插入person,第二条是插入qq,而第三条是一条update语句。
     我们先来看一下数据库,在person表和qq表中,qq表是外键表,qq表中的person_id是外键,即两表存在主外键关联。
    当调用p.getQqs().add(qq)方法,进行添加时,Hibernate怕在进行p.getQqs().add(qq)这样的操作时出现意外情况,即添加方(qq)和被添加方(p)存在外键不一致的情况。所以就会出现那条更新语句。
    inverse的默认值为false,所以inverse属性默认会进行“关联更新”。inverse值为true,会放弃“关联更新”。
    通俗点讲,将inverse设为false的那一方,意思就是你添加完信息后我还要来维护一下,所以会出现update语句,如果将inverse设为true的话,意思就是我完全相信你,你添加后我就不需要在维护了,所以不会出现update语句。
   
   

你可能感兴趣的:(hibernate,inverse,cascade)