一. 一对多双向(双向即包含了一对多单向和多对一单向的写法)
表结构关系:一端主键对应多端外键
类结构关系:一端具有多端的集合,多端持有一端实例
以下为部门类为一端:
package com.ly.onetomany.model;
//设部门为一端
import java.util.Set;
public class Department {
private int id;
private String name;
//一端具有多端的集合
private Set<Employee> employeelist;
public Department() {
}
public Department(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Employee> getEmployeelist() {
return employeelist;
}
public void setEmployeelist(Set<Employee> employeelist) {
this.employeelist = employeelist;
}
@Override
public String toString() {
return "Department [id=" + id + ", name=" + name + "]";
}
}
以下为职员类。设为多端:
package com.ly.onetomany.model;
//员工表设为多端
public class Employee {
private int id;
private String name;//员工姓名
//多端持有一端实例
private Department department;
public Employee() {
}
public Employee(String name) {
this.name = name;
}
public Employee(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
@Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + ", department=" + department + "]";
}
}
下为一端Department.hbm.xml代码
<?xml version="1.0" encoding="UTF-8"?>
<!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.ly.onetomany.model.Department" table="department">
<id name="id" column="id" type="int">
<generator class="native"></generator>
</id>
<property name="name" column="name" type="java.lang.String">
</property>
<!-- cascade="save-update"为级联,d_id为生成的外键列名 -->
<set name="employeelist" table="employee" cascade="save-update">
<key>
<column name="d_id"/>
</key>
<!-- 对应的多端路径 -->
<one-to-many class="com.ly.onetomany.model.Employee" />
</set>
</class>
</hibernate-mapping>
以下为多端Employee.hnm.xml代码
<?xml version="1.0" encoding="UTF-8"?>
<!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.ly.onetomany.model.Employee" table="employee">
<id name="id" column="id" type="int">
<generator class="native"></generator>
</id>
<property name="name" column="name" type="java.lang.String"></property>
<!-- 以下为多端对应一端的类路径, name="d_id"为相对应的外键列,与一端那设的列名最好保持一致-->
<many-to-one name="department" class="com.ly.onetomany.model.Department">
<column name="d_id" />
</many-to-one>
</class>
</hibernate-mapping>
二:一对一双向
唯一外键关联。本质上是一对多的蜕化形式。在<many-to-one>元素中设置属性unique=”true”就变成了一对一
以下为person类 ;将一端person类,假设为多端类
package com.ly.onetoone.model;
public class Person {
private int id;
private String name;
//持有对方实例
private IDcard idcard;
public Person() {
}
public Person(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public IDcard getIdcard() {
return idcard;
}
public void setIdcard(IDcard idcard) {
this.idcard = idcard;
}
public Person(int id, String name, IDcard idcard) {
this.id = id;
this.name = name;
this.idcard = idcard;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", idcard=" + idcard + "]";
}
}
以下为一端IDcard(身份证)类
package com.ly.onetoone.model;
public class IDcard {
private int id;
private String card;//身份证
//持有对方实例
private Person person;
public IDcard(int id, String card) {
this.id = id;
this.card = card;
}
public IDcard() {
}
public IDcard(int id, String card, Person person) {
this.id = id;
this.card = card;
this.person = person;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCard() {
return card;
}
public void setCard(String card) {
this.card = card;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
@Override
public String toString() {
return "IDcard [id=" + id + ", card=" + card + ", person=" + person + "]";
}
}
以下为一端假设的多端Person类的 Person.hbm.xml
<?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 2017-5-10 15:42:43 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.ly.onetoone.model.Person" table="person">
<id name="id" type="int">
<column name="id" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="name" />
</property>
<!-- 一对一的唯一外键方法 unique="true" -->
<many-to-one name="idcard" class="com.ly.onetoone.model.IDcard" unique="true">
<!-- 外键的列名 -->
<column name="card_id" />
</many-to-one>
</class>
</hibernate-mapping>
以下为IDcard.hbm.xml;
<?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 2017-5-10 15:42:43 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.ly.onetoone.model.IDcard" table="idcard">
<id name="id" type="int">
<column name="id" />
<generator class="native" />
</id>
<property name="card" type="java.lang.String">
<column name="card" />
</property>
<!-- property-ref是为了解决遗留系统中实体之间的关联。
默认情况下,把被关联实体主键字段作为关联字段。有了property-ref,就可以
通过它指定被关联实体主键以外的字段作为关联字段。 -->
<one-to-one name="person" class="com.ly.onetoone.model.Person" property-ref="idcard"></one-to-one>
</class>
</hibernate-mapping>
三。多对多双向
多端Student 类
package com.ly.manytomany.model;
import java.util.Set;
//学生表,设为多端
public class Student {
private String sno;//学生编号
private String sname;//学生姓名
private int age;//年龄
private String sex;//性别
持有对方多端集合
private Set<Course> courseLists;//课程的集合
public Student() {
}
public Student(String sno, String sname, int age, String sex, Set<Course> courseLists) {
this.sno = sno;
this.sname = sname;
this.age = age;
this.sex = sex;
this.courseLists = courseLists;
}
public String getSno() {
return sno;
}
public void setSno(String sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Set<Course> getCourseLists() {
return courseLists;
}
public void setCourseLists(Set<Course> courseLists) {
this.courseLists = courseLists;
}
@Override
public String toString() {
return "Student [sno=" + sno + ", sname=" + sname + ", age=" + age + ", sex=" + sex +
"]";
}
}
多端course类
package com.ly.manytomany.model;
import java.util.Set;
//多端课程表
public class Course {
private String cno;//课程编号
private String cname;//课程名
private String teacher;//课程老师
//持有对方多端集合
private Set<Student> studentlist; //课程表内的学生集合
public Course() {
}
public Set<Student> getStudentlist() {
return studentlist;
}
public void setStudentlist(Set<Student> studentlist) {
this.studentlist = studentlist;
}
public Course(String cno, String cname, String teacher) {
this.cno = cno;
this.cname = cname;
this.teacher = teacher;
}
public String getCno() {
return cno;
}
public void setCno(String cno) {
this.cno = cno;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getTeacher() {
return teacher;
}
public void setTeacher(String teacher) {
this.teacher = teacher;
}
@Override
public String toString() {
return "Course [cno=" + cno + ", cname=" + cname + ", teacher=" + teacher + ", studentlist=" + studentlist + "]";
}
}
以下为Student.hbm.xml
<?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 2017-5-10 21:03:52 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.ly.manytomany.model.Student" table="student">
<id name="sno" type="java.lang.String">
<column name="sno" />
<generator class="native" />
</id>
<property name="sname" type="java.lang.String">
<column name="sname" />
</property>
<property name="age" type="int">
<column name="age" />
</property>
<property name="sex" type="java.lang.String">
<column name="sex" />
</property>
<!-- 多端集合 table="sc"为中间表表名 -->
<set name="courseLists" table="sc" >
<key>
<!-- sno为student表在中间表的字段 -->
<column name="sno" />
</key>
<!-- cno为course表在中间表sc中的字段 -->
<many-to-many class="com.ly.manytomany.model.Course" column="cno"/>
</set>
</class>
</hibernate-mapping>
以下为Course.hbm.xml
<?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 2017-5-10 21:03:52 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.ly.manytomany.model.Course" table="course">
<id name="cno" type="java.lang.String">
<column name="cno" />
<generator class="native" />
</id>
<property name="cname" type="java.lang.String">
<column name="cname" />
</property>
<property name="teacher" type="java.lang.String">
<column name="teacher" />
</property>
<!-- 多端集合 table="sc"为中间表表名 -->
<set name="studentlist" table="sc">
<key >
<!-- cno为course表在中间表sc中的字段 -->
<column name="cno"></column>
</key>
<!-- sno为student表在中间表的字段 -->
<many-to-many class="com.ly.manytomany.model.Student" column="sno"/>
</set>
</class>
</hibernate-mapping>