我有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>
一个用户可以有多本书,一本书有多个用户。但我在进行级联删除的时候出现了奇怪的现象。 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>
解决方案 »
- struts2文件上传路径的疑惑
- 请问我在做联通SGIP短信MO发送时,报java.lang.NegativeArraySizeException
- jsp 显示本地图片
- 模糊查询
- display:table标签能否实现动态列问题?
- tomcat问题
- 下载文件乱码
- xslt转换问题,怎样在创建属性时动态指定名称
- 前辈们可以帮帮忙吗?
- 用myeclipse布置struts报错org.apache.jasper.JasperException: This absolute uri (http://jakarta.apache.org/struts/tags-bean) canno
- 请问如何处理流水号?
- struts2,spring,hibernate 大家进来看看
Exployee b=(Exployee) session.get(Exployee.class,2);
session.delete(b);
也应该不出错啊
session.executeUpdate不行。
session.delete运行机制:根据主表检查是否存在关联子表,如果存在,则把子表内外键置为空,使之脱离级联关系,再进行主表的删除,用delete你可以检查下,子表里面的外键被设定为null啦。
session.executeUpdate运行机制:直接执行主表的删除
thank you 高手
有了解了些 接分吧 哈哈~~~~