2012-11-10 54 views
0

我正在使用HIbernate 3.2.5。我有部门和培训表之间的一对多关联。一个部门有能力参加一次以上的培训。Cascade DELETE关联混淆

<id name="deptId" type="integer" column="DEPT_ID"> 
     <generator class="assigned"></generator> 
    </id> 
    <property name="deptName"> 
     <column name="DEPT_NAME"></column> 
    </property> 
    <map name="trainingDetails" inverse="false" cascade="delete" lazy="false"> 
     <key column="DEPT_ID"></key> 
     <map-key formula="ID" type="integer"></map-key> 
     <one-to-many class="model.Training"/> 
    </map>  

当我尝试删除条目:

SessionFactory sf = new Configuration().configure("trial.cfg.xml").buildSessionFactory(); 
    Session session = sf.openSession(); 
    Dept department = new Dept(); 
    department.setDeptId(2);   
    session.delete(department); 
    session.flush(); 
    session.close(); 

我可以看到,子表更新查询是越来越打印在控制台,而不是删除查询:

update training set DEPT_ID=null where DEPT_ID=? 

但是因为级联是delete因此子表也应该执行delete操作而不是update对不对?

请让我知道我的错误在哪里。

问候,

回答

1

如果使用级联为DELETE_ORPHAN指出,子对象不能独立存在,它会做。

另外,您在删除之前没有加载对象图。执行删除如下:

SessionFactory sf = new Configuration().configure("trial.cfg.xml") 
             .buildSessionFactory(); 
    Session session = sf.openSession(); 
    //load the object before deleting 
    Dept department = session.get(Dept.class, new Integer(2)); 
    session.delete(department); 
    session.flush(); 
    session.close(); 
+0

不,我试过但得到了同样的结果。仍然执行'update'而不是子表上的'delete'。 – user182944

+0

@ user182944更新了答案。请尝试。 –

+0

现在确定'delete'和'delete-orphan'正在工作。是因为我加载对象的方式吗?请详细解释一下。 – user182944