Commontop.xml
   <set name="pouringgirder" lazy="false" cascade="all">
      <key>
          <column name="ct_id" not-null="false"></column>
      </key>
      <one-to-many class="com.zjrd.entity.Pouringgirder"/>
   </set>Pouringgirder.xml
   <many-to-one name="commontop" class="com.zjrd.entity.Commontop"  fetch="select" not-found="ignore" insert="false" update="false">
       <column name="ct_id" not-null="true" ></column>
   </many-to-one>delete.action
public String deleteCommontop(){
int id=Integer.parseInt(request.getParameter("id"));
this.cmtBiz.deleteCommontop(id);
return "delete";
}关联id保存在多的一方Pouringgirder表中,并且是非空。然后运行,直接报错:
严重: Servlet.service() for servlet default threw exception
com.microsoft.sqlserver.jdbc.SQLServerException: 不能将值 NULL 插入列 'ct_id',表 'Bridge.dbo.pouringgirder';列不允许有空值。UPDATE 失败。
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:196)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1454)
         ...
由报错信息,我觉得是删除操作并不是在删除一表的时候直接删除关联多表,而是把多表的关联id改为null了,关联多表还是存在的,然后我想要的是在删除一表的时候,直接删除与之相关联的多表。
上网搜了一遍后,只找到了一个答案,在一表配置文件的<set>内加入inverse="true",交出主控权,再次运行之后,功能实现了,但是再次报错:
严重: Servlet.service() for servlet default threw exception
java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Integer.java:415)
at java.lang.Integer.parseInt(Integer.java:497)
at com.zjrd.action.CommontopAction.findCommontopById(CommontopAction.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
         ...
对此,十分费解,思路完全串不起来,求高手解惑,或者指点下正确的功能实现方法。
想要的结果:级联删除,删除一,直接关联删除多!

解决方案 »

  1.   

    汗死,不细心害死人啊,问题找到了,我的return “delete”;跳转的是另一个需要传值的action方法中去了,所以值为空了,报错!
    不过还是想问,为什么加上inverse= "true "能解决第一个异常?
    没人接分吗?
      

  2.   

    第一个异常:
    删除Commontop时,Commontop对应的Pouringgirder所关联的Commontop就不存在了。
    而Commontop要维护关系,所以就修改外键为空。而外键被设置为not nul.