关联映射即:持久化类的属性 是 引用另一持久化类的类
1.单向 N-1映射 student - school 每个学生对应一个正在就读的学校 通过学生访问学校
1.1 无连接表
①POJO类
Student.java
Student类 由于要访问School类属性 ,所有要提供school属性 及setter getter 方法
package xy.po;
public class Student
{
public Student()
{
}
private int id;
private String name;
private School school;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public School getSchool() {
return school;
}
public void setSchool(School school) {
this.school = school;
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
}
School.java
School类就是一普通的持久化类
package xy.po;
public class School
{
public School()
{
}
private int id;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
private String address;
private String phone;
}
②映射文件
Student.hbm.xml
<?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">
<!--package 指定下面类的包前缀 -->
<hibernate-mapping package="xy.po">
<!-- 类 与 表 的映射 若无指定package属性则须全名表示 xy.po.Hero -->
<class name="Student" table="Student">
<!--标识名 类型 -->
<id name="id" type="java.lang.Integer">
<!-- 标识属性对应的列 -->
<column name="id" />
<!-- 主键生成器 -->
<generator class="identity" />
</id>
<!-- 普通属性映射 -->
<property name="name" type="string">
<column name="stu_name" />
</property>
<!-- N-1 为该属性(name)指定列名(column)作为外键列 (显示在本表 外键列默认为关联表的主键) -->
<!-- cascade:是否打开级联 class:指定关联类 -->
<many-to-one name="school" column="school_id" cascade="all" class="School"/>
</class>
</hibernate-mapping>
School.hbm.xml
<?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">
<!--package 指定下面类的包前缀 -->
<hibernate-mapping package="xy.po">
<!-- 类 与 表 的映射 若无指定package属性则须全名表示 xy.po.Hero -->
<class name="School" table="school">
<!--标识名 类型 -->
<id name="id" type="java.lang.Integer">
<!-- 标识属性对应的列 -->
<column name="id" />
<!-- 主键生成器 -->
<generator class="identity" />
</id>
<!-- 普通属性映射 -->
<property name="name" type="string">
<column name="sc_name" />
</property>
<property name="address" type="string">
<column name="address" />
</property>
</class>
</hibernate-mapping>
1.2 有连接表
只须将映射配置文件 Student.hbm.xml 的jmany标签修改为join标签即可
<join table="Student_School">
<!--指定连接表以本表主键作为外键的 属性列名 -->
<key column="Student_id"/>
<!--指定关联属性外键列 -->
<many-to-one name="school" cascade="all" class="School" column="school_id"/>
</join>
2.单向1-1
只须将N-1的映射配置文件 Student.hbm.xml 的<many-to-one>标签添加unique唯一属性即可
3.单向1-n
3.1无连接表
①pojo
Student.java 添加集合属性
private Set<School> school = new HashSet<School>();
②映射文件Student.hbm.xml
<set name="school" cascade="all">
<!--指定外键列名字 该列显示在关联的对象表-->
<key column="student_id"/>
<!-- 映射到实体类 -->
<one-to-many class="School" />
</set>
3.2有连接表
修改映射文件即可
<!-- 指定集合属性 -->
<set name="school" table="Student_School">
<!--指定连接表的参照本表的外键列名-->
<key column="student_id"/>
<!-- 连接表的映射类外键列 -->
<many-to-many class="School" column="School_id" unique="true"/>
</set>
4.单向N-N 修改映射文件如下
<!-- 指定集合属性 -->
<set name="school" table="Student_School">
<!--指定连接表的参照本表的外键列名-->
<key column="student_id"/>
<!-- 连接表的映射类外键列 -->
<many-to-many class="School" column="School_id"/>
</set>