Hibernate多对一关联映射原理、映射方法和数据的保存
本文由发表于6年前 | J2EE | 暂无评论 |  被围观 10,647 views+

Hibernate的多对一关联映射实现的基本原理就是:

在多的一端加入一个外键,指向一的一端,映射完成之后使得加载多的一端数据的同时能把关联的一的一端的数据加载上来。

两个类实现多对一的关联映射步骤:
User类作为一的一端:
public class User {

	private String userEmail;
	private String userPasswd;
	public String getUserEmail() {
		return userEmail;
	}
	public void setUserEmail(String userEmail) {
		this.userEmail = userEmail;
	}
	public String getUserPasswd() {
		return userPasswd;
	}	
}
QuestionAnswer类作为多的一端,则需要加入一个User作为外键:
public class QuestionAnswer {

	private int answerId;
	private String answerContent;
	private User answerAnswerer;
	public int getAnswerId() {
		return answerId;
	}
	public void setAnswerId(int answerId) {
		this.answerId = answerId;
	}
	public String getAnswerContent() {
		return answerContent;
	}
	public void setAnswerContent(String answerContent) {
		this.answerContent = answerContent;
	}
	public void setAnswerAnswerer(StudentInfo answerAnswerer) {
		this.answerAnswerer = answerAnswerer;
	}
}
User类的映射配置如下:
<hibernate-mapping>
<class name="com.exam.entity.User" table="exam_user" lazy="false">
	<id name="userEmail" column="user_email"></id>
	<discriminator column="user_type" type="string"/>
	<property name="userPasswd" column="user_passwd" length="20"/>
</class>
</hibernate-mapping>
QuestionAnswer类的映射配置如下:
<hibernate-mapping>
	<class name="com.exam.entity.QuestionAnswer" table="exam_question_answer">
		<id name="answerId" column="answer_id" type="int">
			<generator class="increment" />
		</id>
		<property name="answerContent" column="answer_content" type="text" />		
		<many-to-one name="answerAnswerer" column="question_answer"/>
	</class>
</hibernate-mapping>

从上面的两个配置文件可以看出,多对一的关联映射只需要在多的一端配置一个<many-to-one>标签就可以了,如上面QuestionAnswer类的配置生成的表的question_answer为指向一的一端的外键。

关于多对一关联保存需要注意的事项

按照上面的配置保存数据时,需要先保存User,让Transient状态的User对象变成Persistent状态,才能保存QuestionAnswer,因为只有User变成了Persistent状态之后QuestionAnswer对象才能获取到User的主键作为外键关联,Persistent状态的对象不能引用Transient状态的对象。代码如下:

User user = new User();
user.setUserEmail("arthinking@qq.com");
user.setUserPasswd("arthinking");
session.save(user);

QuestionAnswer answer = new QuestionAnswer();
answer.setAnswerContent("Answer!");
answer.setAnswerAnswerer(user);
session.save(answer);
或者可以设置级联操作:

在多的一端的<many-to-one>标签设置级联属性:

<many-to-one name="answerAnswerer" column="question_answer" cascade="save-update"/>

这样就表示级联保存和级联更新,就会不用显示save(user)了,而是自动级联保存。

Cascade可以的取值为:

all:代表所有情况都进行级联操作
none:不进行级联操作
save-update:保存或更新时进行级联操作
delete:级联删除

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

有人回复时邮件通知我
J2EE的相关文章
随机文章 本月热门 热评
1 说说Scrum敏捷开发 2014/6/1
2 Chrome插件开发 – UI外观 2013/6/4
3 ExtJS表格使用JsonStore条件查询参数不能传递参数给第二页的解决方法 2011/7/29
4 C++语法笔记 – 群体类和群体数据 类模板 2011/9/4
5 JSP的运行机制与原理 2011/6/17
6 Java基础笔记 – 内部类 静态内部类 成员内部类 局部内部类 匿名内部类 2011/11/3
友情推荐 更多
破博客 文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。
Mr.5's Life 白天是一名程序员,晚上就是个有抱负的探索者
行知-追寻技术之美 关注大数据,分布式系统
我爱编程 编程成长轨迹
Cynthia's Blog 学习笔记 知识总结 思考感悟
 
猜您喜欢
欢迎关注我的公众号 IT宅
关于IT宅 文章归档

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

联系我们:admin@itzhai.com

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