Hibernate一对多关联映射的配置及其级联删除问题
本文由发表于6年前 | J2EE | 评论数 1 |  被围观 17,755 views+

首先举一个简单的一对多双向关联的配置:
一的一端: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:设定是否延迟加载
<set>元素包含以下属性:
name:设定映射的持久化类的属性名
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()操作。

除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接:http://www.itzhai.com/hibernate-one-to-many-association-mapping-configuration-and-the-cascade-delete-problem.html
arthinking Java技术交流群:280755654,入门群:428693174 more
分享到:
 
2011 5/26
如果您有更好的原创技术博文或者观点,欢迎投稿:admin@itzhai.com,或者关注订阅左侧浮动面板的微信号订阅IT宅itread)发送消息。
文章评论
    一条评论
给我留言

有人回复时邮件通知我
J2EE的相关文章
随机文章 本月热门 热评
1 禅茶 2014/3/23
2 IKAnalyzer词典占用内存大小分析 2014/6/9
3 Hibernate多对一关联映射原理、映射方法和数据的保存 2011/5/29
4 org.hibernate.LazyInitializationException的解决方法 使用OpenSessionInViewFilter 2011/7/31
5 据说这套试题对于软考很有帮助,大家可以看看 2011/4/26
6 数据结构笔记 – 排序算法 冒泡排序算法实现 2011/9/20
友情推荐 更多
破博客 文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。
Mr.5's Life 白天是一名程序员,晚上就是个有抱负的探索者
行知-追寻技术之美 关注大数据,分布式系统
我爱编程 编程成长轨迹
Cynthia's Blog 学习笔记 知识总结 思考感悟
 
猜您喜欢
欢迎关注我的公众号 IT宅
关于IT宅 文章归档

IT宅中的文章除了标题注明转载或有特别说明的文章,均为IT宅的技术知识总结,学习笔记或随笔。如果喜欢,请使用文章下面提供的分享组件。转载请注明出处并加入文章的原链接。 感谢大家的支持。

联系我们:admin@itzhai.com

Theme by arthinking. Copyright © 2011-2015 IT宅.com 保留所有权利.