我现在有三表A,B,C
B表是中间表,A和C表分别对B进行1对多的映射
配置文件如下(拿关键的)
在A和C的映射文件都存在这样一段
<set name="sysRelRoleReses" inverse="true" lazy="false"  cascade="all-delete-orphan">
            <key>
                <column name="SYS_RES_ROW_ID" precision="22" scale="0" not-null="true" />
            </key>
            <one-to-many class="com.zjhcsoft.biap.role.entity.SysRelRoleRes" />
</set>在B映射文件有这样一段
<many-to-one name="sysRole" class="com.zjhcsoft.biap.role.entity.A" fetch="select" lazy="false">
            <column name="SYS_ROLE_ROW_ID" precision="22" scale="0" not-null="true" />
</many-to-one>
<many-to-one name="sysResourceBySysRowId" class="com.zjhcsoft.biap.resource.entity.C" fetch="select" lazy="false">
            <column name="SYS_ROW_ID" precision="22" scale="0" not-null="true" />
</many-to-one>我现在在对A或者C进行删除操作
方法如下
ADao.deleteByKey(A.ID);
或者使用先remove再delete的方法实现都会提示
deleted object would be re-saved by cascade异常我想了半天没想出原因,最后发现是两边都对中间表进行一对多关联的时候才有这个问题,我把一边的映射文件中的SET注释掉后,就可以正常删除了,但是这样就对我造成困扰了,我两边都需要这样做,请问该怎么去处理~

解决方案 »

  1.   

    hibernate现在好像还不支持一对多删除
      

  2.   

    是不是inverse属性的问题? inverse为true 就是将控制权交给多表 这样就不能级联删除了 改成false试试 一表控制多表的级联操作
      

  3.   

    这个问题可以解决的,之前我做双向many-to-many时曾遇到过这样的问题。
    hibernate现在完全支持从一方删除数据,不过我们要设置如下属性:inverse="false" 将主主控权给一方,
    casecade = all. 支持级联,能连续delete
    要不你试下
      

  4.   

    你可以不用将many-to-many类型转换为两个on-to-many类型,直接将两张表关联起来,只要加一张关联表就行了,那样更好操作。
      

  5.   

     你在A  <set name="sysRelRoleReses" inverse="true"...的一方设置inverse="true"表示将控制权叫给多的一方(b),而你调用的又是ADao.deleteByKey(A.ID); 似乎不妥吧!因为你的控制权已经叫给b了啊,所以会出错。你可以试一试先得到a = session.load(a.class,id),再通过a.getB()得到B,
    再通过B.remove(a),来实现!
      

  6.   

    我觉得是因为在删除A时,已经级连删除了B,再删除C时,B已经不存在了,就会报异常,可以在B中也加级连,只删除A或C就可达到同时删除了
      

  7.   

    inverse=“true”和你后面调用的方法矛盾