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); } }