错误的原因在于你删除了这个customer对象的时候没把这个可户的orders对象给删除。
删除这个customer对象后,对应order表中的和这个customer相关的记录的customer_id这个字段就只能为null了,
但是你的这个字段又是不能为空的。
Hibernate: select customers0_.ID as ID1_0_, customers0_.NAME as NAME1_0_ from do.dbo.CUSTOMERS customers0_ where customers0_.ID=?     //取这个对象
Tom
Hibernate: select orders0_.CUSTOMER_ID as CUSTOMER3_1_, orders0_.ID as ID1_, orders0_.ID as ID2_0_, orders0_.ORDER_NUMBER as ORDER2_2_0_, orders0_.CUSTOMER_ID as CUSTOMER3_2_0_ from do.dbo.ORDERS orders0_ where orders0_.CUSTOMER_ID=?    //删除这个对象
Hibernate: update do.dbo.ORDERS set CUSTOMER_ID=null where CUSTOMER_ID=?    
//级连更新,把null赋给非null ,会出问题的在customer配置文件中<set>加上 cascade="all" . 意思就是对customer对象的操作会级联到order上。
inverse = "false" ,表示由customer对象维持关系 .
 

解决方案 »

  1.   

    首先谢谢yztommyhc ,按照你的说法,我把inverse="false"写上了,可是还是有问题
    最后我把它改成了true,才可以级联删除,不过有些地方我不是很明白
    <set
         name="orders"
         cascade="delete"
         inverse="true" //将关联关系的维护工作交给了对象Order
    >
    也就是说,按照Order对象状态的变化来同步更新数据库,
    但是在操作的时候,我删除的是customer对象,并没有删除orders对象
    为什么可以级联删除?
      

  2.   

    你的逻辑应该是由customer对象来级联操作order对象。
    因为如果一个customer有多个orders,那么删除一个order是不应该删除这个customer的。<set
         name="orders"
         cascade="delete"
         inverse="true" //将关联关系的维护工作交给了对象Order
    > 这个配置是不符合上面逻辑的。你在order的配置文件里 <many-to-one > 加上   inverse="true"  ,cascade="delete"表示由customer来控制级联 。上面的inverse="true" 去掉。然后程序里面操作的是删除customer对象 。