多对一的关系和关系数据库中的外键参考关系最匹配,即在己方的表中的一个外键参照另一个表的主键。
例如:多个学生对应一个班级。
通过在多方持有一方的引用实现,需要在”多”的一端使用<many-to-one>
配置。
修改Student类,如下:
package com.imooc.entity;
import java.io.Serializable;
public class Student implements Serializable {
private int sid;
private String sname;
private String sex;
//在多方定义一个一方的引用
private Grade grade;
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Student() {
}
public Student(int sid, String sname, String sex) {
this.sid = sid;
this.sname = sname;
this.sex = sex;
}
public Student(String sname, String sex) {
this.sname = sname;
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">
<!-- Generated 2016-4-12 21:51:49 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.imooc.entity.Student" table="student">
<id name="sid" type="int">
<column name="sid" />
<generator class="increment" />
</id>
<property name="sname" type="java.lang.String">
<column name="sname" />
</property>
<property name="sex" type="java.lang.String">
<column name="sex" />
</property>
<!-- 配置多对一关联关系 -->
<many-to-one name="grade" class="com.imooc.entity.Grade" column="gid">
</many-to-one>
</class>
</hibernate-mapping>
Grade类为:
package com.imooc.entity;
import java.io.Serializable;
public class Grade implements Serializable {
private int gid;
private String gname;
private String gdesc;
public int getGid() {
return gid;
}
public void setGid(int gid) {
this.gid = gid;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
public String getGdesc() {
return gdesc;
}
public void setGdesc(String gdesc) {
this.gdesc = gdesc;
}
//构造方法
public Grade() {
super();
}
public Grade(int gid, String gname, String gdesc) {
this.gid = gid;
this.gname = gname;
this.gdesc = gdesc;
}
public Grade(String gname, String gdesc) {
this.gname = gname;
this.gdesc = gdesc;
}
}
其关系映射文件为:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-4-12 21:51:49 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.imooc.entity.Grade" table="grade">
<id name="gid" type="int">
<column name="gid" />
<generator class="increment" />
</id>
<property name="gname" type="java.lang.String">
<column name="gname" length="20" not-null="true"/>
</property>
<property name="gdesc" type="java.lang.String">
<column name="gdesc" />
</property>
</class>
</hibernate-mapping>
测试Test。
保存班级学生信息,方法如下:
//将学生添加到班级
public static void add()
{
Grade g = new Grade("一年级一班", "xx小学一年级一班");
Student s1 = new Student("张三", "男");
Student s2 = new Student("小美", "女");
//设置关系
s1.setGrade(g);
s2.setGrade(g);
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
session.save(g);
session.save(s1);
session.save(s2);
transaction.commit();
HibernateUtil.closeSession(session);
}
在控制台会输出如下的信息:
Hibernate: select max(gid) from grade
Hibernate: select max(sid) from student
Hibernate: insert into grade (gname, gdesc, gid) values (?, ?, ?)
Hibernate: insert into student (sname, sex, gid, sid) values (?, ?, ?, ?)
Hibernate: insert into student (sname, sex, gid, sid) values (?, ?, ?, ?)