您的位置:首页 > 其它

Cascade和inverse的区别

2016-12-02 09:01 225 查看
可以这样理解,cascade定义的是关系两端对象到对象的级联关系;而inverse定义的是关系和对象的级联关系。

  inverse只对set+one-to-many(或many-to-many)有效,对many-to-one, one-to-one无效。cascade对关系标记都有效。

   inverse对集合对象整体起作用,cascade对集合对象中的一个一个元素起作用,如果集合为空,那么cascade不会引发关联操作。

  比如将集合对象置为null, school.setStudentSet(null)

    inverse导致hibernate执行:udpate STUDENT set SCHOOL_ID=null where SCHOOL_ID=?

    cascade则不会执行对STUDENT表的关联更新, 因为集合中没有元素。

  再比新增一个school, session.save(school)

    inverse导致hibernate执行:

     for( 对(school的每一个student ){

      udpate STUDENT set SCHOOL_ID=? where STUDENT_ID=? //将学生的school_id改为新的school的id

     }

    cascade导致hibernate执行:

     for( 对school的每一个student ){

      session.save(aStudent); //对学生执行save操作

     } 

   extends:如果改变集合中的部分元素(比如新增一个元素),

    inverse: hibernate先判断哪些元素改变了,对改变的元素执行相应的sql

    cascade: 它总是对集合中的每个元素执行关联操作。

    (在关联操作中,hibernate会判断操作的对象是否改变)

  两个起作用的时机不同:

    cascade:在对主控方操作时,级联发生。

    inverse: 在flush时(commit会自动执行flush),对session中的所有set,hibernate判断每个set是否有变化,

   对有变化的set执行相应的sql,执行之前,会有个判断:if( inverse == true ) return;可以看出cascade在先,inverse在后。

   inverse 对set + one-to-many 和 set + many-to-many 起的作用不同。hibernate生成的sql不同。

      对one-to-many,hibernate对many方的数据库表执行update语句。

      对many-to-many, hibernate对关系表执行insert/update/delte语句,注意不是对many方的数据库表而是关系表。

     cascase 对set都是一致的,不管one-to-many还是many-to-many。都简单地把操作传递到set中的每个元素。所以它总是更新many方的数据库表。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: