cascade,你db里的外键建起来了么?

解决方案 »

  1.   

    外键?他们的联系是通过column="COMP_ID"/>建立的阿,你是说非要有foreign-key的吗?这个只是个名称吧,hibernate in action里面讲cascade例子都没有要这个,虽然他用的是cascade="save-update"
      

  2.   

    在关联关系中 inverse=false 的是主控方(默认是false),inverse=true 的是被控方。inverse 和 cascade 实际上是两个互不相关的概念,inverse 指的是关联关系的控制方向。而cascade 是指是否对它的关联关系进行级连操作。
      

  3.   

    抛开这个问题不说,如果A 一方设置成inverse=true,B的是inverse=false,而A这端有cascade=all-delete-orphan,那么,控制方应该是B了,但是通过A删除存有B的集合,它不是会删除的B吗?(就我这个帖子的里面那个例子来说,至少,删除A的时候,B是被删除了的),那不是A在控制吗?
      

  4.   

    同意zeq258(近朱者赤) 的观点,楼主把inverse和cascade的概念混淆了就算是主控方为B,但是你是在A上设定的cascade,两个互不影响
      

  5.   

    恩,就算没影响,但为什么cascade="delete-orphan"不起作用呢?他并没有删除集合中的那些被删除了的对象阿。
      

  6.   

    我也做了一个测试mysql+hibernate3.0两个表user,room,多对一关联,
    <set name="user" table="USERO2M" cascade="delete-orphan" inverse="true" lazy="true">
        <key column="ROOM_ID1"/>
        <one-to-many class="com.softbrain.wangzl.hibernate.one2many.User"></one-to-many>
    </set>测试类        Room room = (Room) session.load(Room.class, new Long(1));
            
            room.getUser().remove(room.getUser().toArray()[0]);
            System.out.println(room.getUser().size());
            tx.commit();控制台打印:
    Hibernate: select room0_.ROOM_ID as ROOM1_0_, room0_.ADDRESS as ADDRESS1_0_ from ROOMO2M room0_ where room0_.ROOM_ID=?
    Hibernate: select user0_.ROOM_ID1 as ROOM3_1_, user0_.USER_ID as USER1_1_, user0_.USER_ID as USER1_0_, user0_.NAME as NAME0_0_, user0_.ROOM_ID1 as ROOM3_0_0_ from USERO2M user0_ where user0_.ROOM_ID1=?
    1
    Hibernate: delete from USERO2M where USER_ID=?
      

  7.   

    delete-orphan当对象从association(例如一个Collection)中移除时,会同时删除该对象的持久化对象。
      

  8.   

    呵呵,这确实很奇怪,我又作了测试,我的cascade="delete-orphan"如果删除父亲则可以删除儿子,但清空儿子集合再保存,则儿子没被删除,但我用cascade="all-delete-orphan"则两种情况都能删除阿!