10 映射-- 多对多(老师与学生)
学生类:
package dao.po;
import java.util.Set;
/**
* @author zl 学生类
*/
public class Student
{
private int id;
private String name;
private Set<Teacher> teachers;
}
老师类:
package dao.po;
import java.util.Set;
/**
* @author zl 老师类
*/
public class Teacher
{
private int id;
private String name;
private Set<Student> 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="dao.po"> <class name="Student"> <id name="id"> <generator class="native"/> </id> <property name="name" not-null="true" length="255" column="`name`"/> <!-- name="teachers" 表示:Student类中有一个属性叫teachers (是Set集合)--> <!-- table="teacher_student" 表示:中间表表名叫teacher_student --> <set name="teachers" table="teacher_student"> <!-- column="student_id" 表示:中间表teacher_student的字段--> <!-- Student类的id与中间表teacher_student的字段student_id对应--> <key column="student_id"/> <!-- column="teacher_id" 表示:中间表teacher_student的字段--> <!-- class="Teacher" 表示:中间表teacher_student的字段teacher_id与 Teacher类的id对应--> <many-to-many class="Teacher" column="teacher_id"/> </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="dao.po"> <class name="Teacher"> <id name="id"> <generator class="native"/> </id> <property name="name" not-null="true" length="255" column="`name`"/> <set name="students" table="teacher_student"> <key column="teacher_id"/> <many-to-many class="Student" column="student_id"/> </set> </class> </hibernate-mapping>
保存操作, 查询就不说了:
package dao;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import dao.po.Student;
import dao.po.Teacher;
public class Many2Many
{
/**
* @param args
*/
public static void main(final String[] args)
{
add();
}
/**
* 添加几个老师与学生
*/
public static void add()
{
final Teacher t1 = new Teacher();
t1.setName("语文老师");
final Teacher t2 = new Teacher();
t2.setName("数学老师");
final Student s1 = new Student();
s1.setName("学生小明");
final Student s2 = new Student();
s2.setName("学生小红");
// final Set<Teacher> set_t = new HashSet<Teacher>();
// set_t.add(t1);
// set_t.add(t2);
final Set<Student> set_s = new HashSet<Student>();
set_s.add(s1);
set_s.add(s2);
//给老师set 学生
t1.setStudents(set_s); //建立关联,只在一方面建立关联就行了, 不可给学生set()了老师,再老师set()了学生
t2.setStudents(set_s); //建立关联,只在一方面建立关联就行了, 不可给学生建了关联,再老师建关联
//给学生set 老师
//不可以再做
Session session = null;
try
{
session = HibernateUtil.getSeesion();
final Transaction tx = session.beginTransaction();
session.save(t1);
session.save(t2);
session.save(s1);
session.save(s2);
tx.commit();
}
finally
{
if (session != null)
{
session.close();
}
}
}
}
// 中间表teacher_student 表结构如下 :
//| teacher_student | CREATE TABLE `teacher_student` (
// `teacher_id` int(11) NOT NULL,
// `student_id` int(11) NOT NULL,
// PRIMARY KEY (`student_id`,`teacher_id`),
// KEY `FK2E2EF2DE4BF3A147` (`teacher_id`),
// KEY `FK2E2EF2DE3B5856A7` (`student_id`),
// CONSTRAINT `FK2E2EF2DE3B5856A7` FOREIGN KEY (`student_id`) REFERENCES `student
//` (`id`),
// CONSTRAINT `FK2E2EF2DE4BF3A147` FOREIGN KEY (`teacher_id`) REFERENCES `teacher
//` (`id`)
//) ENGINE=InnoDB DEFAULT CHARSET=utf8 |