1. 程式人生 > >hibernate關聯關係(一對多、多對一)

hibernate關聯關係(一對多、多對一)

1.什麼是關聯關係?

關聯關係是指兩個實體或者表有相互關聯,比如在學生表中,學生表有班級id,那麼學生表中的班級id就關聯班級表中班級Id欄位。因此關聯關係,可以看成是一種外來鍵關係。

2.為什麼要有關聯關係?

為了實現級聯操作,刪除班級中某個學生,會連帶刪除學生表中的學生,以便維護表資料的一致性。

3.hibernate中實現關聯關係

 3.1單向一對多關係

package com.hibernate.hibernate_one2many;

import java.io.Serializable;

public class Student implements Serializable {
	private static final long serialVersionUID = 1L;
	private Integer sid;
	private String sname;
	private String sex;

	public Student() {
	}

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

	public Integer getSid() {
		return sid;
	}

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

	public String getSname() {
		return sname;
	}

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

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}
}
package com.hibernate.hibernate_one2many;

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

public class Grade implements Serializable {
	private static final long serialVersionUID = 1L;
	private Integer gid;
	private String gname;
	private String descs;
	private Set<Student> students = new HashSet<Student>();;

	public Grade() {
	}

	public Grade(String gname, String descs) {
		this.gname = gname;
		this.descs = descs;
	}

	public Integer getGid() {
		return gid;
	}

	public void setGid(Integer gid) {
		this.gid = gid;
	}

	public String getGname() {
		return gname;
	}

	public void setGname(String gname) {
		this.gname = gname;
	}

	public String getDescs() {
		return descs;
	}

	public void setDescs(String descs) {
		this.descs = descs;
	}

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

	public void setStudents(Set<Student> students) {
		this.students = students;
	}
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hibernate.hibernate_one2many">
	<class name="Grade" table="Grade">
		<id name="gid" column="GID" type="java.lang.Integer">
			<generator class="increment"></generator>
		</id>
		<property name="gname" column="GNAME" type="java.lang.String"></property>
		<property name="descs" column="DESCS" type="java.lang.String"></property>
		<set name="students" table="STUDENT">
			<key column="GID"></key>
			<one-to-many class="Student"/>
		</set>
	</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hibernate.hibernate_one2many">
	<class name="Student" table="Student">
		<id name="sid" column="SID" type="java.lang.Integer">
			<generator class="increment"></generator>
		</id>
		<property name="sname" column="SNAME" type="java.lang.String"></property>
		<property name="sex" column="SEX" type="java.lang.String"></property>
	</class>
</hibernate-mapping>

3.2單向多對一關係

package com.hibernate.hibernate_one2many;

import java.io.Serializable;

public class Grade implements Serializable {
	private Integer gid;
	private String gname;
	private String descs;

	public Grade(String gname, String descs) {
		this.gname = gname;
		this.descs = descs;
	}

	public Grade() {
	}

	public Integer getGid() {
		return gid;
	}

	public void setGid(Integer gid) {
		this.gid = gid;
	}

	public String getGname() {
		return gname;
	}

	public void setGname(String gname) {
		this.gname = gname;
	}

	public String getDescs() {
		return descs;
	}

	public void setDescs(String descs) {
		this.descs = descs;
	}
}
package com.hibernate.hibernate_one2many;

import java.io.Serializable;

public class Student implements Serializable {
	private Integer sid;
	private String sname;
	private String sex;
	private Grade grade;

	public Student(String sname, String sex, Grade grade) {
		this.sname = sname;
		this.sex = sex;
		this.grade = grade;
	}

	public Grade getGrade() {
		return grade;
	}

	public void setGrade(Grade grade) {
		this.grade = grade;
	}

	public Student() {
	}

	public Integer getSid() {
		return sid;
	}

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

	public String getSname() {
		return sname;
	}

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

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.hibernate.hibernate_many2one.entity.Grade" table="Grade">
		<id name="gid" column="GID" type="java.lang.Integer">
			<generator class="increment"></generator>
		</id>
		<property name="gname" column="GNAME" type="java.lang.String"></property>
		<property name="descs" column="DESCS" type="java.lang.String"></property>
	</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.hibernate.hibernate_many2one.entity.Student" table="Student">
		<id name="sid" column="SID" type="java.lang.Integer">
			<generator class="increment"></generator>
		</id>
		<property name="sname" column="SNAME" type="java.lang.String"></property>
		<property name="sex" column="SEX" type="java.lang.String"></property>
		<many-to-one name="grade" class="com.hibernate.hibernate_many2one.entity.Grade" column="gid" ></many-to-one>
	</class>
</hibernate-mapping>

總結:

實現單向一對多、多對一的兩個步驟:

1.在實體類中加入對單方或對多方的引用(對多方的引用要用集合屬性,Set、List、Map等)

2.在hbm.xml配置檔案中,配置對引用的關聯資訊

多對一關聯,在多方配置hbm.xml中要配置

<many-to-one name="多方實體類中持有的一方引用名" class="所持有的一方引用對應類的許可權名" column="多方關聯到一方的列名" ></many-to-one>

一對多關聯,在一方配置hbm.xm中要配置

<set name="一方持有的多方的集合名" table="多方集合中實體類對應的表名">
	<key column="被多方指向列明,也集多方指向一方的主鍵key"></key>
	<one-to-many class="多方對應的類的許可權名"/>
</set>