我有2个表   用户表 exployee 和 书表 book 
一个用户可以有多本书,一本书有多个用户。但我在进行级联删除的时候出现了奇怪的现象。     Query query = session.createQuery("delete from Exployee where id = ?"); 
    query.setInteger(0,3); 
    query.executeUpdate(); 用这个进行级联删除 删除用户同时删除书表中此用户有的书时候报下面异常
Hibernate: delete from test.exployee where id=?
SQL Error: 2292, SQLState: 23000
ORA-02292: 违反完整约束条件 (TEST.F) - 已找到子记录日志Exception in thread "main" org.hibernate.exception.ConstraintViolationException: could not execute update query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:84)
at org.hibernate.hql.ast.QueryTranslatorImpl.executeUpdate(QueryTranslatorImpl.java:334)
at org.hibernate.engine.query.HQLQueryPlan.performExecuteUpdate(HQLQueryPlan.java:209)
at org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:1126)
at org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:94)
at com.jdx.xiaotest3.action.MapTest.main(MapTest.java:30)
Caused by: java.sql.SQLException: ORA-02292: 违反完整约束条件 (TEST.F) - 已找到子记录日志 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1891)
at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1093)
at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2047)
at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1940)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2709)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:589)
at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:75)
... 5 more
而我同样用上面代码删除一个没有关联的用户可以删除同时我用下面代码也可以实现级联删除     Exployee b=(Exployee) session.get(Exployee.class,2);    
    session.delete(b);就是用delete语句不能删除
这是hbm.xml的配置
<hibernate-mapping>
<class name="com.jdx.xiaotest3.book.utils.Exployee" table="exployee" schema="test">
<id name="id" type="java.lang.Integer">
<generator class="assigned"></generator>
</id>
<property name="name" type="java.lang.String"></property>
<property name="sex" type="java.lang.String"></property>
<property name="address" type="java.lang.String"></property>
<property name="psot" type="java.lang.String"></property>
<property name="age" type="java.lang.Integer"></property>
<property name="phone" type="java.lang.String"></property><set name="books"  inverse="true" cascade="delete">
<key>
<column name="EXPLOREEID"></column>
</key>
<one-to-many class="com.jdx.xiaotest3.book.utils.Book"/>
</set></class>
</hibernate-mapping>

解决方案 »

  1.   

    楼主仔细检查你的表关系和数据,这个错误不是hibernate的问题,是你数据库的问题
      

  2.   

    如果是表关系有问题  我直接用
            Exployee b=(Exployee) session.get(Exployee.class,2);    
            session.delete(b);
    也应该不出错啊 
      

  3.   

    hibernate3就是这样的,进行级联删除就是要用session.delete,
    session.executeUpdate不行。
    session.delete运行机制:根据主表检查是否存在关联子表,如果存在,则把子表内外键置为空,使之脱离级联关系,再进行主表的删除,用delete你可以检查下,子表里面的外键被设定为null啦。
    session.executeUpdate运行机制:直接执行主表的删除
      

  4.   


    thank you  高手 
    有了解了些  接分吧  哈哈~~~~