双向一对多的级联删除问题-----delete级联操作只支持持久化对象的级联操作
来源:互联网 发布:ubuntu安装32位库 编辑:程序博客网 时间:2024/04/25 07:08
首先举一个简单的一对多双向关联的配置:
一的一端:QuestionType类
package com.exam.entity;import java.util.Set;public class QuestionType {private String typeName;private char typeUniqueness;private Set quesion;public String getTypeName() {return typeName;}public void setTypeName(String typeName) {this.typeName = typeName;}public char getTypeUniqueness() {return typeUniqueness;}public void setTypeUniqueness(char typeUniqueness) {this.typeUniqueness = typeUniqueness;}public Set getQuesion() {return quesion;}public void setQuesion(Set quesion) {this.quesion = quesion;}}
配置文件:
<hibernate-mapping package="com.exam.entity"><class name="QuestionType" table="exam_question_type"><id name="typeName" column="type_name"></id><property name="typeUniqueness" column="type_uniqueness"/><set name="quesion" inverse="true" cascade="delete"><key column="question_type_name"/><one-to-many class="Question"/></set></class></hibernate-mapping>
多的一端:Question类
package com.exam.entity;import java.util.Date;public class Question {private int questionNo;private QuestionType questionType;private String questionsTitle;public int getQuestionNo() {return questionNo;}public void setQuestionNo(int questionNo) {this.questionNo = questionNo;}public QuestionType getQuestionType() {return questionType;}public void setQuestionType(QuestionType questionType) {this.questionType = questionType;}public String getQuestionsTitle() {return questionsTitle;}public void setQuestionsTitle(String questionsTitle) {this.questionsTitle = questionsTitle;}}
配置文件:
<hibernate-mapping package="com.exam.entity"><class name="Question" table="exam_question"><id name="questionNo" column="question_no" ><generator class="increment" /></id><many-to-one name="questionType" column="question_type_name"/><property name="questionsTitle" column="questions_title" length="200" /></class></hibernate-mapping>
首先说明一下一些常用的属性:
<many-to-one>元素包含以下属性:
name:设定映射的持久化类的属性名
column:设定和持久化类的属性对应的表的外键
class:设定持久化类的属性的类型
cascade:设定是否级联
lazy:设定是否延迟加载
column:设定和持久化类的属性对应的表的外键
class:设定持久化类的属性的类型
cascade:设定是否级联
lazy:设定是否延迟加载
<set>元素包含以下属性:
name:设定映射的持久化类的属性名
cascade:设置是否级联
inverse:设定反向控制,如果为true则一的一端不维护外键
<key>:设定与所关联的持久化类对应的表的外键。
one-to-many:设定所关联的持久化类
cascade:设置是否级联
inverse:设定反向控制,如果为true则一的一端不维护外键
<key>:设定与所关联的持久化类对应的表的外键。
one-to-many:设定所关联的持久化类
如果要对一对多关联映射进行级联删除,可以按照上面的举例进行配置:
首先看到一的一端:
<set name="quesion" inverse="true" cascade="delete"><key column="question_type_name"/><one-to-many class="Question"/></set>
这里设置inverse表示一的一端不维护外键,设置cascade=”delete”表示删除一的一端时对关联到得多的所有的对象也一起删除
再看到多的一端:
<many-to-one name="questionType" column="question_type_name"/>
这里的column表示外键的名,需要和一的一端设置的key标签里的column保持一致,表示维护同一个键值。
可以按照如下的代码执行删除操作:
session.beginTransaction();QuestionType questionType = (QuestionType) session.load(QuestionType.class, "判断题");session.delete(questionType);session.getTransaction().commit();
这里使用load查上来的对象是持久状态的(Persistent),只有是Persistent状态的对象才可以使用session.delete()操作进行级联删除,由new创建的对象属于Transient状态,不能进行session.delete()操作。
也就是说配置文件的cascade,不会对表结构的外键进行cascade。hibernate仅仅是对对象来级联,因此需要在持久化状态下的对象,才能进行级联操作!!
- 双向一对多的级联删除问题-----delete级联操作只支持持久化对象的级联操作
- Hibernate持久化对象的级联操作
- 双向一对多关联,级联删除瞬态,游离状态以及持久状态下的对象问题总结,由此可以了解控制inverse,以及级联cascade
- Hibernate一对多双向级联操作
- hibernate 十, 持久化对象间的级联操作
- hibernate_day03_07_一对多操作(级联删除)
- 数据库的级联删除操作
- Hibernate的一对多增改级联操作
- delete的级联操作,以及不设置级联操作的问题
- 【JPA 级联保存/级联删除】@OneToMany (双向) 一对多
- 【JPA 级联保存/级联删除】@OneToMany (双向) 一对多
- hibernate一对多双向级联删除
- 一对多双向关联,级联删除
- hibernate 级联删除 双向一对多
- SQL语句中Delete的级联操作
- hibernate中hbm的级联操作(一对多)
- hibernate的级联保存操作(一对多)
- LinQ的级联操作
- Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
- 详解大端模式和小端模式
- 编程从业五年的十四条经验,句句朴实
- Oracle Connect by细说
- Linux下配置jdk1.7
- 双向一对多的级联删除问题-----delete级联操作只支持持久化对象的级联操作
- IIS 上传文件大小限制
- 1094 平方和数列求和
- 中国市场只是全豹一斑 来看看诺基亚在全球的颓势(诺基亚的悲剧可说是从其死守塞班系统开始的)
- Extjs4处理json日期和时间
- 1095 乘法数列求和
- 小米手机驱动安装
- 从苹果的震慑中醒来!
- XFRM Programming