做博客管理系统时,博客和评论时一对多,多对一的关系,
一个博客多条评论,在删除博客时候报错
错误信息如下:
could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
我的数据库里面blo_id不允许为空导致删除博客出现报错
解决方案:
在实体类 blog里面添加级联,问题解决
cascade(级联)
级联在编写触发器时经常用到,触发器的作用是当 主控表信息改变时,用来保证其关联表中数据同步更新。若对触发器来修改或删除关联表相记录,必须要删除对应的关联表信息,否则,会存有脏数据。所以,适当的做法是,删除主表的同时,关联表的信息也要同时删除,在hibernate中,只需设置cascade属性值即可。
cascade表示级联操作,在hibernate配置注解 @OneToOne,@OneToMany,@ManyToMany,@ManyToOne中的属性。
例如:
cascade属性
cascade:就是对表进行增,删,改(查询与它无关)的时候对级联表进行操作
cascade属性的可选值:
all :所有情况下均进行关联操作。
none:所有情况下均不进行关联操作。这是默认值。
save-update:在执行save/update/saveOrUpdate时进行关联操作。
delete:在执行delete时进行关联操作。
inverse
inverse:决定主表还是从表维护关系
两个可选属性false与true
inverse属性默认是false,若为false,则关联由自己控制,
若为true,则关联由对方控制。
一般inverse=false会放在多的一端,
inverse 和 cascade两属性不同的值hibernate对应不同的行为
inverse=true, cascade=delete | 版本被删除,版本与项目的关联关系记录被删除 |
---|---|
inverse=false, cascade=delete | 版本被删除时,hibernate尝试置关联关系为当前版本的记录,版本字段为null. 当置位失败时,版本不能删除 |
配置多种级联
例如:
-
CascadeType.PERSIST:级联新增(又称级联保存):对order对象保存时也对items里的对象也会保存。对应EntityManager的presist方法。
-
例子:只有A类新增时,会级联B对象新增。若B对象在数据库存(跟新)在则抛异常(让B变为持久态)
-
CascadeType.MERGE:级联合并(级联更新):若items属性修改了那么order对象保存时同时修改items里的对象。对应EntityManager的merge方法
。 例子:指A类新增或者变化,会级联B对象(新增或者变化) -
CascadeType.REMOVE:级联删除:对order对象删除也对items里的对象也会删除。对应EntityManager的remove方法。
例子:REMOVE只有A类删除时,会级联删除B类;
-
CascadeType.REFRESH:级联刷新:获取order对象里也同时也重新获取最新的items时的对象。对应EntityManager的refresh(object)方法有效。即会重新查询数据库里的最新数据。
CascadeType.ALL:以上四种都是。
在此记录学习过程中遇到的错误,也许我讲的不是很清楚,哈哈,大佬还请勿喷,多多指教