HIbernate一对多映射删除不起作用

时间:2016-08-24 15:20:06

标签: java hibernate db2

我们有三个表TABLE_A,TABLE_B和TABLE_C。 A& B与外键具有一对一映射(两个表具有相同的主ID)。 B& C有一对多的关系。我已经定义了hibernate映射,如下所示。

<class name="com.test.ClassA" table="TABLE_A">
        <id name="aId" type="long">
            <column name="A_ID" />
            <generator class="assigned" />
        </id>
        <one-to-one name="classB" class="com.test.ClassB"   cascade="all" lazy="false"/>
    </class>
    <class name="com.test.classB" table="TABLE_B">
        <id name="aId" type="long">
            <column name="A_ID" />
            <generator class="assigned"/>
        </id>
        <one-to-one name="classA" class="com.test.ClassA" constrained="true"/>
        <set name="listOfC" table="TABLE_C" inverse="false"     lazy="false" fetch="select" cascade="all-delete-orphan">
            <key>
                <column name="A_ID" not-null="true"/>
            </key>
            <one-to-many class="com.test.ClassC"/>
        </set>
    </class>
    <class name="com.test.ClassC"   table="TABLE_C">
        <id name="id" type="long">
            <column name="ID" />
            <generator class="identity"/>
        </id>
        <many-to-one name="classB" class="com.test.ClassB"  fetch="select">
            <column name="A_ID"/>
        </many-to-one>
    </class>

当我尝试插入/更新ClassA时,B和C都会被保存。但是在尝试删除A时,我遇到了约束违规异常。

得到&amp;删除逻辑

public ClassA getClassA(final long aID)throws HibernateException, SQLException
{ 
    HibernateCallback callback = new HibernateCallback() 
    {
        public Object doInHibernate(Session session) throws HibernateException, SQLException 
        {
            Criteria hctr = session.createCriteria(ClassA.class);
            hctr.add(Restrictions.eq("A_ID", aID));
            return hctr.list();
        }
    };
    List list = (List)this.getHibernateTemplate().execute(callback);
    if(list==null || list.size()==0)
    {
        return null;
    }
    return (ClassA)list.get(0);
}

public void deleteClassA(long aId)抛出HibernateException,SQLException {     ClassA classA = getClassA(aId);     如果(ClassA的!= NULL)     {         。this.getHibernateTemplate()删除(CLASSA);     } }

  

更新TABLE_C集A_ID = null其中A_ID =?];约束[null];嵌套   异常是org.hibernate.exception.ConstraintViolationException:   无法删除集合:[com.test.ClassB.listOfC#77675] at   org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:659)     在   org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:414)     在   org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:416)     在   org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:379)     在   org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:887)     在   org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:882)         引起:com.ibm.db2.jcc.am.oo:将NULL值赋给a   NOT NULL列“TBSPACEID = 3,TABLEID = 480,COLNO = 1”不允许..   SQLCODE = -407,SQLSTATE = 23502,DRIVER = 3.58.81

出于某种原因,Hibernate试图用空值更新TABLE_C条目而不是删除它。我观察到的一件事是,当使用getClassA()函数加载classA时,ClassC中的“aId”值为null。我已经验证了表格,价值确实存在。从DB读取时不知道为什么它为空。

1 个答案:

答案 0 :(得分:0)

要使cascade.delete工作hibernate需要将实体传递给delete操作而不是id。然后在你的情况下用deleteClassA替换deleteClassA(long aId)(A a) 请参阅此链接Hibernate delete objects on cascade