在hibernate中也有多對多的關係。但是這樣關係執行的效率不高,所以我們可以通過兩個多對1或者兩個1對多來實現。
在現實生活中多對多的關係也比較常見。比如說老師和學生。一個老師有多個學生,一個學生也有多個老師。
如何?老師和學生的關係我們可以建立一個中間表。中間表的作用就是關聯老師和學生用的。
大家請看這個表:
這個3個表就是這種關係。現在我來寫一個執行個體來實現以上的關係。
1teacher類
package com.fish.testdao;
import java.util.Set;
public
class Teacher {
private
int id;
private String
name;
Set<Student> students;
public
int getId() {
return
id;
}
public
void setId(int 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;
}
}
2student類
package com.fish.testdao;
import java.util.Set;
public
class Student {
private
int id;
private String
name;
Set<Teacher> teachers;
public
int getId() {
return
id;
}
public
void setId(int 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;
}
}
3.學生xml
<?xml
version="1.0"
encoding="UTF-8"?>
<!DOCTYPE
hibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class
name="com.fish.testdao.Student">
<id
name="id"
type="integer">
<generator
class="increment"></generator>
</id>
<property
name="name"></property>
<set
name="teachers"
table="teacher_student">//我們會產生一個老師學生關聯表
<key
column="student_id"></key>//然後我們會在這個表中產生一個student_id的欄位
<many-to-many
class="com.fish.testdao.Teacher"column="teacher_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
*注set就是用來做中間表的關聯的。其實這個在一個表中有就可以了。這個set可以在techer的xml省去。當然寫上也不會有錯。
4.techer的xml
<?xml
version="1.0"
encoding="UTF-8"?>
<!DOCTYPE
hibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class
name="com.fish.testdao.Teacher">
<id
name="id"
type="integer">
<generator
class="increment"></generator>
</id>
<property
name="name"></property>
<set
name="students"
table="teacher_student">
<key
column="teacher_id"></key>
<many-to-many
class="com.fish.testdao.Student"column="student_id"
/>
</set>
</class>
</hibernate-mapping>
5.我們寫一個測試方法。
packagecom.fish.domain;
importjava.util.HashSet;
import java.util.List;
import java.util.Set;
importorg.hibernate.Query;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
importcom.fish.testdao.Student;
importcom.fish.testdao.Teacher;
public class Test4 {
public static Session getMySession() {
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");
SessionFactory factory =configuration.buildSessionFactory();
Session session = factory.openSession();
return session;
}
//向3個表添加資料,這個方法裡面我打了注釋。因為如果你同時向中間表裡面加資料,那肯定會報錯的。試想兩個set都是描述的是一種關係。那麼同時插入一定會報錯。
public static void add() {
// Set<Student> setStu = newHashSet<Student>();
Set<Teacher> setTea = newHashSet<Teacher>();
Teacher teacher = new Teacher();
Student student = new Student();
student.setName("qwe");
teacher.setName("黃老師");
// setStu.add(student);
setTea.add(teacher);
student.setTeachers(setTea);
// teacher.setStudents(setStu);
Session session = getMySession();
Transaction transaction = session.beginTransaction();
transaction.begin();
session.save(student);
session.save(teacher);
transaction.commit();
session.close();
}
public static void query() {
String hql = "from Teacher";
Session session = getMySession();
Query query = session.createQuery(hql);
List<Teacher> list = query.list();
for (Teacher i : list) {
System.out.println(i.getName() + "有學生:");
for (Student j : i.getStudents()) {
System.out.print(j.getName());
}
System.out.println();
}
session.close();
}
public static void main(String[] args) {
query();
}
}
接著我給你們看看這三個表的資料庫中的資料。
查詢結果是: