为了账号安全,请及时绑定邮箱和手机立即绑定

在删除记录期间处理错误

在删除记录期间处理错误

犯罪嫌疑人X 2021-07-13 17:06:11
void deleteFilm(@PathVariable(value = "id") Integer id) {     try {         filmService.deleteFilm(id);     }     catch (ConstraintViolationException e) {         throw e;     }     catch (SQLIntegrityConstraintViolationException ex) {     }}    2018-08-15 18:12:10.075  WARN 8568 --- [io-8080-exec-10] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1451, SQLState: 230002018-08-15 18:12:10.075 ERROR 8568 --- [io-8080-exec-10] o.h.engine.jdbc.spi.SqlExceptionHelper   : Cannot delete or update a parent row: a foreign key constraint fails (`todo`.`seance`, CONSTRAINT `FKchlcmip8ejlfuo4c990k5ry8y` FOREIGN KEY (`film_id`) REFERENCES `film` (`id`))2018-08-15 18:12:10.077  INFO 8568 --- [io-8080-exec-10] o.h.e.j.b.internal.AbstractBatchImpl     : HHH000010: On release of batch it still contained JDBC statements2018-08-15 18:12:10.080 ERROR 8568 --- [io-8080-exec-10] o.h.i.ExceptionMapperStandardImpl        : HHH000346: Error during managed flush [org.hibernate.exception.ConstraintViolationException: could not execute statement]com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`todo`.`seance`, CONSTRAINT `FKchlcmip8ejlfuo4c990k5ry8y` FOREIGN KEY (`film_id`) REFERENCES `film` (`id`))    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_131]    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_131]    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_131]    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_131]ConstraintViolationException 不捕获错误并且使用 SQLIntegrityConstraintViolationException 我永远不会被相应的 try 块抛出
查看完整描述

1 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

这是一个编程错误,必须通过选择如何处理外键来纠正。

问题是您正在删除父记录,留下孤立条目(film_idin todo.seance,它引用了电影 ID)

你有两个选择

  • 进行级联删除,这样如果一部影片被删除,相应的seance记录也会被删除(由数据库自动完成)。MySQL关于外键的文档在这里(包含参考选项,其中包括on delete cascade,等等)

  • 将应用程序逻辑更改seancefilm_id在删除父电影记录之前先删除条目。

请记住,您需要显式抛出异常:

catch (SQLIntegrityConstraintViolationException ex) {

    //Assuming deleteFilm() has the correct throws clause

    throw ex; //you are not doing this.

}


查看完整回答
反对 回复 2021-07-23
  • 1 回答
  • 0 关注
  • 223 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信