hibernate的多對多例子講解(加圖片)

來源:互聯網
上載者:User

在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();

       }

}

接著我給你們看看這三個表的資料庫中的資料。


查詢結果是:


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.