现在的位置: 首页 > 综合 > 正文

Hibernate3.5.3 之 多对多 关联映射

2013年01月22日 ⁄ 综合 ⁄ 共 3267字 ⁄ 字号 评论关闭
package com.ethan.domain;

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

public class Student {
	private Integer id;
	private String name;
	private Set<Teacher> teachers;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Set<Teacher> getTeachers() {
		return teachers;
	}
	public void setTeachers(Set<Teacher> teachers) {
		this.teachers = teachers;
	}
}
<?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="com.ethan.domain">
	<class name="Student">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		
		<set name="teachers" table="teacher_student">
			<!-- 中间表一个主键也是外键,根据这个自己的这个student_id找到对应的teacher_id
			从而拿到teacher对象 -->
			<key column="student_id"></key>
			<many-to-many class="Teacher" column="teacher_id"></many-to-many>
		</set>
	</class>
</hibernate-mapping>

package com.ethan.domain;

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

public class Teacher {
	private Integer id;
	private String name;
	private Set<Student> students;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Set<Student> getStudents() {
		return students;
	}
	public void setStudents(Set<Student> students) {
		this.students = 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="com.ethan.domain">
	<class name="Teacher">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		
		<set name="students" table="teacher_student">
			<!-- 中间表一个主键也是外键,根据这个自己的这个teacher_id找到对应的student_id -->
			<key column="teacher_id"></key>
			<many-to-many class="Student" column="student_id"></many-to-many>
		</set>
	</class>
</hibernate-mapping>

package com.ethan.hibernate;

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

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.ethan.domain.Employee;
import com.ethan.domain.Student;
import com.ethan.domain.Teacher;
import com.ethan.hibernate.util.HibernateUtil;

public class Many2Many {
	
	public static void add() {
		Session s = null;
		Transaction tx = null;
		
		try {
			Set<Teacher> ts = new HashSet<Teacher>();
			Teacher t1 = new Teacher();
			t1.setName("t1");
			
			Teacher t2 = new Teacher();
			t2.setName("t2");
			
			ts.add(t1);
			ts.add(t2);
			
			Set<Student> ss = new HashSet<Student>();
			Student s1 = new Student();
			s1.setName("s1");
			
			Student s2 = new Student();
			s2.setName("s2");
			ss.add(s1);
			ss.add(s2);
			
			//设置对象关系,不会产生update语句,设置一方就行了
			t1.setStudents(ss);
			t2.setStudents(ss);
			
			/*//产生重复插入中间表,报异常
			s1.setTeachers(ts);
			s2.setTeachers(ts);*/
			
			s = HibernateUtil.getSession();
			tx = s.beginTransaction();
			
			s.save(t1);
			s.save(t2);
			s.save(s1);
			s.save(s2);
			tx.commit();
		} finally {
			if(s!=null) {
				s.close();
			}
		}
	}
	
	public static void query(int teacherId) {
		Session s = null;
		Transaction tx = null;
		
		try {
			s = HibernateUtil.getSession();
			tx = s.beginTransaction();
			
			//会查三张表,效率很低
			Teacher teacher = (Teacher) s.get(Teacher.class, teacherId);
			System.out.println(teacher.getStudents().size());
			tx.commit();
		} finally {
			if(s!=null) {
				s.close();
			}
		}
	}
}

package com.ethan.test;

import static org.junit.Assert.*;

import org.junit.Test;

import com.ethan.hibernate.Many2Many;

public class TestMany2Many {

	@Test
	public void test() {
		Many2Many.add();
	}
	
	@Test
	public void query() {
		Many2Many.query(1);
	}
}

抱歉!评论已关闭.