1、 ManyToMany模式:

我们以老师和学生为例,一个老师可以交很多学生,同样一个学生可以拥有多个老师,所以,他们之间的关系就是n:n的。
从实体模型来看。有2个对象,但是为了在数据库中表示出2者的n:n的关系,我们还得引入一张表。

2、 sql脚本:

use HibernateQuickUse;
drop table if exists teacher_student_relation;
drop table if exists Teacher;
drop table if exists Student;

create table Teacher (
 tid varchar(32) primary key,
 name varchar(32) not null
);

create table Student (
 sid varchar(32) primary key,
 name varchar(128) not null
);

create table teacher_student_relation (
 id integer auto_increment primary key,
 teacher_id varchar(32) not null,
 student_id varchar(32) not null,
 foreign key(teacher_id) references Teacher(tid),
 foreign key(student_id) references Student(sid)
);

通过模型,创建java类如下:

3、 Student.java

package org.py.hib.relation.many2many;

import java.util.HashSet;
import java.util.Set;

@SuppressWarnings("serial")
public class Student implements java.io.Serializable
{
 private String id;

 private String name;

 private Set<Teacher> teachers = new HashSet<Teacher>(0);

 public Student()
 {
 }

 public String getId()
 {
  return this.id;
 }

 public void setId(String id)
 {
  this.id = id;
 }

 public String getName()
 {
  return this.name;
 }

 public void setName(String name)
 {
  this.name = name;
 }

 public Set<Teacher> getTeachers()
 {
  return teachers;
 }

 public void setTeachers(Set<Teacher> teachers)
 {
  this.teachers = teachers;
 }
}

4、 Teacher.java:

package org.py.hib.relation.many2many;

import java.util.HashSet;
import java.util.Set;

@SuppressWarnings("serial")
public class Teacher implements java.io.Serializable
{
 private String id;

 private String name;

 private Set<Student> students = new HashSet<Student>(0);

 public Teacher()
 {
 }

 public String getId()
 {
  return this.id;
 }

 public void setId(String id)
 {
  this.id = id;
 }

 public String getName()
 {
  return this.name;
 }

 public void setName(String name)
 {
  this.name = name;
 }

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

 public void setStudents(Set<Student> students)
 {
  this.students = students;
 }

}

5、 数据库文件hibernate.cfg.xml

同上一实例

6、 Student.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="org.py.hib.relation.many2many.Student"
  table="student">
  <id name="id" type="java.lang.String" column="sid" length="32">
   <generator class="uuid" />
  </id>

<property name="name" type="java.lang.String" column="name"
   length="128" not-null="true" />

  <set name="teachers" table="teacher_student_relation" cascade="save-update" inverse="false">
   <key column="student_id" not-null="true" />

   <many-to-many column="teacher_id"
    class="org.py.hib.relation.many2many.Teacher"
    />
  </set>
 </class>
</hibernate-mapping>

set中的 table 指向的是数据库中的关联表。

cascade 用的是save-update , 且inverse用的是false,这样的话,当进行修改和保存和删除时,关联表中的记录也会删掉.

如果cascade 用的是 all 那么连同student表中的记录也会被删除掉。

key中的column指的是: 关联表中与Student发生关系的字段。

而many-to-many中的column指的是:关联表中,与class(这里是:org.py.hib.relation.many2many.Teacher)发生关系的字段。

7、 Teacher.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="org.py.hib.relation.many2many.Teacher"
  table="teacher">
  <id name="id" type="java.lang.String" column="tid"
   length="32">
   <generator class="uuid" />
  </id>

  <property name="name" type="java.lang.String" column="name"
   length="32" not-null="true" />

  <set name="students" table="teacher_student_relation" cascade="save-update"
   inverse="false">
   <key column="teacher_id" not-null="true" />
   <many-to-many class="org.py.hib.relation.many2many.Student"
    column="student_id" />
  </set>
 </class>
</hibernate-mapping>

这里的inverse也采用了false,这样子的话,Teacher和Student都维护关系表中的关系。

1、 ManyToMany模式:

我们以老师和学生为例,一个老师可以交很多学生,同样一个学生可以拥有多个老师,所以,他们之间的关系就是n:n的。
从实体模型来看。有2个对象,但是为了在数据库中表示出2者的n:n的关系,我们还得引入一张表。

2、 sql脚本:

use HibernateQuickUse;
drop table if exists teacher_student_relation;
drop table if exists Teacher;
drop table if exists Student;

create table Teacher (
 tid varchar(32) primary key,
 name varchar(32) not null
);

create table Student (
 sid varchar(32) primary key,
 name varchar(128) not null
);

create table teacher_student_relation (
 id integer auto_increment primary key,
 teacher_id varchar(32) not null,
 student_id varchar(32) not null,
 foreign key(teacher_id) references Teacher(tid),
 foreign key(student_id) references Student(sid)
);

通过模型,创建java类如下:

3、 Student.java

package org.py.hib.relation.many2many;

import java.util.HashSet;
import java.util.Set;

@SuppressWarnings("serial")
public class Student implements java.io.Serializable
{
 private String id;

 private String name;

 private Set<Teacher> teachers = new HashSet<Teacher>(0);

 public Student()
 {
 }

 public String getId()
 {
  return this.id;
 }

 public void setId(String id)
 {
  this.id = id;
 }

 public String getName()
 {
  return this.name;
 }

 public void setName(String name)
 {
  this.name = name;
 }

 public Set<Teacher> getTeachers()
 {
  return teachers;
 }

 public void setTeachers(Set<Teacher> teachers)
 {
  this.teachers = teachers;
 }
}

4、 Teacher.java:

package org.py.hib.relation.many2many;

import java.util.HashSet;
import java.util.Set;

@SuppressWarnings("serial")
public class Teacher implements java.io.Serializable
{
 private String id;

 private String name;

 private Set<Student> students = new HashSet<Student>(0);

 public Teacher()
 {
 }

 public String getId()
 {
  return this.id;
 }

 public void setId(String id)
 {
  this.id = id;
 }

 public String getName()
 {
  return this.name;
 }

 public void setName(String name)
 {
  this.name = name;
 }

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

 public void setStudents(Set<Student> students)
 {
  this.students = students;
 }

}

5、 数据库文件hibernate.cfg.xml

同上一实例

6、 Student.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="org.py.hib.relation.many2many.Student"
  table="student">
  <id name="id" type="java.lang.String" column="sid" length="32">
   <generator class="uuid" />
  </id>

<property name="name" type="java.lang.String" column="name"
   length="128" not-null="true" />

  <set name="teachers" table="teacher_student_relation" cascade="save-update" inverse="false">
   <key column="student_id" not-null="true" />

   <many-to-many column="teacher_id"
    class="org.py.hib.relation.many2many.Teacher"
    />
  </set>
 </class>
</hibernate-mapping>

set中的 table 指向的是数据库中的关联表。

cascade 用的是save-update , 且inverse用的是false,这样的话,当进行修改和保存和删除时,关联表中的记录也会删掉.

如果cascade 用的是 all 那么连同student表中的记录也会被删除掉。

key中的column指的是: 关联表中与Student发生关系的字段。

而many-to-many中的column指的是:关联表中,与class(这里是:org.py.hib.relation.many2many.Teacher)发生关系的字段。

7、 Teacher.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="org.py.hib.relation.many2many.Teacher"
  table="teacher">
  <id name="id" type="java.lang.String" column="tid"
   length="32">
   <generator class="uuid" />
  </id>

  <property name="name" type="java.lang.String" column="name"
   length="32" not-null="true" />

  <set name="students" table="teacher_student_relation" cascade="save-update"
   inverse="false">
   <key column="teacher_id" not-null="true" />
   <many-to-many class="org.py.hib.relation.many2many.Student"
    column="student_id" />
  </set>
 </class>
</hibernate-mapping>

这里的inverse也采用了false,这样子的话,Teacher和Student都维护关系表中的关系。

 

没有登录不能评论