hibernate關聯關係(一對多、多對一)
阿新 • • 發佈:2018-12-10
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>