我们有三个表TABLE_A,TABLE_B和TABLE_C。 A & B与外键具有一对一映射(两个表具有相同的主ID)。 B & C有一对多的关系。我已经定义了如下的hibernate映射。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得到保存。但是,试图删除答:当我得到约束违反异常
得到&删除逻辑
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);
}
公共无效deleteClassA(长AID)抛出HibernateException的,的SQLException { ClassA的CLASSA = getClassA(AID) ; if(classA!= null) this.getHibernateTemplate()。delete(classA); } }
更新TABLE_C设置A_ID = NULL其中A_ID =];约束[null];嵌套0例外是org.hibernate.exception.ConstraintViolationException: 无法删除收集:在 org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException [com.test.ClassB.listOfC#77675](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) at org.springframework.orm.hibernate3.HibernateTemplate.delete(Hiberna teTemplate.java:887) at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:882) 引起:com.ibm.db2.jcc.am.oo:将NULL值分配给 NOT NULL列 “TBSPACEID = 3,TABLEID = 480,COLNO = 1” 是不允许.. SQLCODE = -407,SQLSTATE = 23502,DRIVER = 3.58.81
出于某种原因,休眠正试图用NULL值更新TABLE_C条目而不是删除它。我观察到的一件事是,当使用getClassA()函数加载classA时,ClassC中的“aId”值为null。我已经验证了该表并且该值确实存在。从数据库读取时不知道为什么它为空。