区县和街道级联,表中的关系是qxid为Jd表的外键
实体类Qx:
public class Qx implements java.io.Serializable {
private Integer qxid;
private String qxname;
private Set jds = new HashSet(0);         getter and setter ......
}
实体类Jd:public class Jd implements java.io.Serializable {
private Integer jdid;
private Qx qx;
private String jdname;          getter and setter ......
}映射文件:
Jd.hbm.xml
<hibernate-mapping>
    <class name="com.myjava.entity.Jd" table="JD" schema="dbo" catalog="test">
        <id name="jdid" type="java.lang.Integer">
            <column name="jdid" />
            <generator class="native" />
        </id>
        <many-to-one name="qx" class="com.myjava.entity.Qx" fetch="select">
            <column name="qxid" />
        </many-to-one>
        <property name="jdname" type="java.lang.String">
            <column name="jdname" length="50" />
        </property>
    </class>
</hibernate-mapping>
Qx.hbm.xml<hibernate-mapping>
 <class catalog="test" name="com.myjava.entity.Qx" schema="dbo" table="QX">
  <id name="qxid" type="java.lang.Integer">
   <column name="qxid"/>
   <generator class="native"/>
  </id>
  <property generated="never" lazy="false" name="qxname" type="java.lang.String">
   <column length="50" name="qxname"/>
  </property>
  <set inverse="true" name="jds" sort="unsorted" cascade="all">
   <key>
    <column name="qxid"/>
   </key>
   <one-to-many class="com.myjava.entity.Jd"/>
  </set>
 </class>
</hibernate-mapping>使用session的delete()方法进行删除,结果报错:Hibernate: delete from test.dbo.QX where qxid=?
2011-10-17 19:04:13 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet action threw exception
com.microsoft.sqlserver.jdbc.SQLServerException: DELETE 语句与 REFERENCE 约束"FK_JD_QX"冲突。该冲突发生于数据库"test",表"dbo.JD", column 'qxid'。
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(Unknown Source)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(Unknown Source)
at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23)
at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2520)
at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2697)
at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:74)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:146)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at com.myjava.dao.QxDAO.delete(QxDAO.java:53)
at com.myjava.biz.QXBiz.del(QXBiz.java:19)
at com.myjava.struts.action.QxAction.doDel(QxAction.java:59)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)在线等请高人指教

解决方案 »

  1.   

     DELETE 语句与 REFERENCE 约束"FK_JD_QX"冲突。该冲突发生于数据库"test",表"dbo.JD", column 'qxid'。
      应该注意这个错误。你用数据库直接执行这个句子看看,如果不行说明这个语句有问题了。
    delete from test.dbo.QX where qxid=?
      

  2.   

    在数据库里面也是这个错误,如果我把外键关系里面的insert和update规范设为层叠就好了,但是不应该是在hibernate里面设它的cascade属性么,在数据库里面这么操作hibernate的级联删除就没有意义了
      

  3.   

    你用的什么数据库?如果是mysql的话你直接在数据库里面设置cascade就可以了,然后通过IDE自动生成配置文件就可以了。
      

  4.   


    sqlserver2005  配置文件也是由IDE自动生成的,但是删除的时候如果不设置外键关系的insert和update规范就出这样的问题,但是如果设置了,hibernate的级联删除就没有意义了
      

  5.   


    好久没有用hibernate了,应该是你配置文件中设置级联的关系有问题。
      

  6.   


    cascade属性已经设为all了,还要设置别的么,请说明
      

  7.   

    在创建表的时候,外键后面加上ON DELETE CASCADE还有在entity映射文件中加上cascade="all"