Hibernnate单向一对多映射,多对一映射

我们大家都知道,在域模型(实体域)中,关联关系是类与类之间最普遍的关系,他是指通过一个对象持有另一个对象的实例根据UML语言,关系是有方向的。实质上关联映射的本质:将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用搞清关联映射的的关键就在于搞清实体之间的关系。


单向一对多:

所谓单向一对多,就是实体之间的关系由“一” 的一端加载“多” 的一端,关系由“一”的一端来维护,在JavaBean中是在“一”的一端中持有“多”的一端的集合,Hibernate把这种关系反映到数据库的策略是在“多”的一端的表上加一个外键指向“一” 的一端的表的主键。比如Class(班级)和Student(学生)之间是一对多的关系。一个班级里面有很多的学生,站在班级的角度上来看就是一个班级对应多个学生。在一的一端含有一个多的引用的集合,我们可以根据班级找到它有哪些学生,而不能根据学生找到他对应的班级。



package com.usc.bean;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class Class implements Serializable {
	private int id;
	private String cname;
	private String cdes;
	private Set<Student> students = new HashSet<>();

	public Class() {
	}

	public Class(String cname, String cdes) {
		super();
		this.cname = cname;
		this.cdes = cdes;
	}

	public Set<Student> getStudents() {
		return students;
	}

	public void setStudents(Set<Student> syudents) {
		this.students = syudents;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getCname() {
		return cname;
	}

	public void setCname(String cname) {
		this.cname = cname;
	}

	public String getCdes() {
		return cdes;
	}

	public void setCdes(String cdes) {
		this.cdes = cdes;
	}

	@Override
	public String toString() {
		return "Class [id=" + id + ", cname=" + cname + ", cdes=" + cdes
				+ ", students=" + students + "]";
	}

}



package com.usc.bean;

import java.io.Serializable;

public class Student implements Serializable{
	private int sid;
	private String sname;
	private int sage;
	
	public Student() {
	}
	public Student(String sname, int sage) {
		this.sname = sname;
		this.sage = sage;
	}
	public int getSid() {
		return sid;
	}
	public void setSid(int sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public int getSage() {
		return sage;
	}
	public void setSage(int sage) {
		this.sage = sage;
	}
	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + ", sage=" + sage
				+ "]";
	}
	
}



实体类配置文件


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Mapping file autogenerated by MyEclipse Persistence Tools -->
<hibernate-mapping>
	<class name="com.usc.bean.Class" table="class" catalog="test">
		<id name="id" type="java.lang.Integer">
			<column name="id" />
			<generator class="native" />
		</id>
		<property name="cname" type="java.lang.String">
			<column name="cname" />
		</property>
		<property name="cdes" type="string">
			<column name="cdes" />
		</property>
		<set name="students">
			<key column="s_gid"></key>
			<one-to-many class="com.usc.bean.Student"/>
		</set>
	</class>
</hibernate-mapping>
</pre><pre code_snippet_id="1574313" snippet_file_name="blog_20160204_5_6459862" name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.usc.bean.Student" table="student" catalog="test">
        <id name="sid" type="java.lang.Integer">
            <column name="sid" />
            <generator class="native" />
        </id>
        <property name="sname" type="java.lang.String">
            <column name="sname"  />
        </property>
        <property name="sage" type="int">
            <column name="sage"  />
        </property>
        
    </class>
</hibernate-mapping>


在一对多中,在一方实体类中创建多方的集合,并在配置文件中用set集合在配置one-to-many。而在多方不需要作额外配置


name--持久化对象的集合的属性名称

<key column="s_gid" ></key>外键的名称

<one-to-many class=cn.edu.bzu.hibernate.Student" />持久化类

<set>元素的inverse属性 在映射一对多的双向关联时,应该在“one”方把inverse属性设为true,这样可提高应用性能。
inverse:控制反转,为true表示反转,由它方负责;反之,不反转,自己负责;如果不设,onemany两方都要负责控制,因此,会引发重复的sql语句以及重复添加数据.


sql建表语句


create table student (
	sid int(10) not null auto_increment primary key,
    sname varchar(15) ,
    sage int(10),
    s_gid int(15) not null,
    foreign key (s_gid) references class(id)

);

create table class(
	id int(10) not null auto_increment primary key,
    cname varchar(15),
    cdes varchar(15)

);



单向多对一:


单向多对一关联是最常见的单向关联关系,如:多个用户属于同一个组,多个学生处于同一个班级。之所以叫他多对一而不是一对多,是因为他们之间的关系是多的一方来维护的。多对一用的更多

多个用户属于一个组,我们用多的一方来维护,所以我们可以根据用户可以知道他在哪个组,而不需要知道一个组里有哪些学生,这就是所谓的单向的。多对一映射原理:在多的一端加入一个外键指向一的一端,它维护的关系多指向一,一对多映射原理,在多的一端加入一个外键指向一的一端,她维护的关系是一指向多也就是说一对多与多对一的映射原理是一样的,只是站的角度不一样


实体类

package com.usc.bean;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class Class implements Serializable {
	private int id;
	private String cname;
	private String cdes;

	public Class() {
	}

	public Class(String cname, String cdes) {
		super();
		this.cname = cname;
		this.cdes = cdes;
	}


	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getCname() {
		return cname;
	}

	public void setCname(String cname) {
		this.cname = cname;
	}

	public String getCdes() {
		return cdes;
	}

	public void setCdes(String cdes) {
		this.cdes = cdes;
	}

	@Override
	public String toString() {
		return "Class [id=" + id + ", cname=" + cname + ", cdes=" + cdes
				+ ", students="  + "]";
	}

}
package com.usc.bean;

import java.io.Serializable;

public class Student implements Serializable {
	private int sid;
	private String sname;
	private int sage;
	private Class mClass;//在多对一中设置一方

	public Student() {
	}

	public Student(String sname, int sage) {
		this.sname = sname;
		this.sage = sage;
	}

	public int getSid() {
		return sid;
	}

	public void setSid(int sid) {
		this.sid = sid;
	}

	public String getSname() {
		return sname;
	}

	public void setSname(String sname) {
		this.sname = sname;
	}

	public int getSage() {
		return sage;
	}

	public void setSage(int sage) {
		this.sage = sage;
	}

	public Class getmClass() {
		return mClass;
	}

	public void setmClass(Class mClass) {
		this.mClass = mClass;
	}

	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + ", sage=" + sage
				+ ", mClass=" + mClass + "]";
	}

}

实体类的配置文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Mapping file autogenerated by MyEclipse Persistence Tools -->
<hibernate-mapping>
	<class name="com.usc.bean.Class" table="class" catalog="test">
		<id name="id" type="java.lang.Integer">
			<column name="id" />
			<generator class="native" />
		</id>
		<property name="cname" type="java.lang.String">
			<column name="cname" />
		</property>
		<property name="cdes" type="string">
			<column name="cdes" />
		</property>

	</class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Mapping file autogenerated by MyEclipse Persistence Tools -->
<hibernate-mapping>
	<class name="com.usc.bean.Student" table="student" catalog="test">
		<id name="sid" type="java.lang.Integer">
			<column name="sid" />
			<generator class="native" />
		</id>
		<property name="sname" type="java.lang.String">
			<column name="sname" />
		</property>
		<property name="sage" type="int">
			<column name="sage" />
		</property>
		<many-to-one name="mClass" class="com.usc.bean.Class"
			column="s_gid"></many-to-one>
	</class>
</hibernate-mapping>

在多对一的关系中,在一方不需要作额外配置,而在多方需要在实体类中添加一方对象,并且在多方配置mangy-to-one

<many-to-one name="mClass" class="com.usc.bean.Class"
			column="s_gid"></many-to-one>
name:一方的对象

class:一方的实体类

column:一方在多方的外键列




参考自:http://blog.csdn.net/csh624366188/article/details/7585129





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值