10 映射-- 多对多(老师与学生)

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 |