В этом примере вы узнаете, как отображать отношения «многие ко многим» с помощью Hibernate. Рассмотрим следующие отношения между студентом и объектом курса .
В зависимости от отношений студент может записаться на любое количество курсов, и курс может иметь любое количество студентов.
Для того, чтобы создать эти отношения вам нужно иметь СТУДЕНТ , КУРС и STUDENT_COURSE таблицу. Реляционная модель показана ниже.
Для создания таблиц STUDENT и COURSE необходимо создать следующие файлы отображения гибернации.
Student.hbm.xml используется для создания СТУДЕНТА и STUDENT_COURSE таблицы.
<?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> <class name="com.vaannila.student.Student" table="STUDENT"> <meta attribute="class-description">This class contains student details.</meta> <id name="studentId" type="long" column="STUDENT_ID"> <generator class="native" /> </id> <property name="studentName" type="string" length="100" not-null="true" column="STUDENT_NAME" /> <set name="courses" table="STUDENT_COURSE" cascade="all"> <key column="STUDENT_ID" /> <many-to-many column="COURSE_ID" class="com.vaannila.student.Course" /> </set> </class> </hibernate-mapping>
Мы используем элемент « многие ко многим», чтобы создать отношения «многие ко многим» между сущностями « Студент» и « Курс» . Поскольку студент может записаться на любое количество курсов, мы используем коллекцию для хранения значений. В этом случае мы используем Set.
Course.hbm.xml используется для создания таблицы COURSE .
<?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> <class name="com.vaannila.student.Course" table="COURSE"> <meta attribute="class-description"> This class contains course details. </meta> <id name="courseId" type="long" column="COURSE_ID"> <generator class="native"/> </id> <property name="courseName" type="string" column="COURSE_NAME"/> </class> </hibernate-mapping>
Теперь создайте файл конфигурации Hibernate и добавьте все файлы сопоставления.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class"> org.hsqldb.jdbcDriver</property> <property name="hibernate.connection.url"> jdbc:hsqldb:hsql://localhost</property> <property name="hibernate.connection.username">sa</property> <property name="connection.password"></property> <property name="connection.pool_size">1</property> <property name="hibernate.dialect"> org.hibernate.dialect.HSQLDialect</property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">create-drop</property> <mapping resource="com/vaannila/student/Student.hbm.xml"/> <mapping resource="com/vaannila/student/Course.hbm.xml"/> </session-factory> </hibernate-configuration>
После создания файла конфигурации сгенерируйте файлы классов Java с помощью Hibernate Tools. (Чтобы сгенерировать код с помощью Hibernate Tools, см. Этот пример )
Будут созданы следующие классы.
package com.vaannila.student; // Generated May 30, 2009 6:48:40 AM by Hibernate Tools 3.2.4.GA import java.util.HashSet; import java.util.Set; /** * This class contains the student details. */ public class Student implements java.io.Serializable { private long studentId; private String studentName; private Set<Course> courses = new HashSet<Course>(0); public Student() { } public Student(String studentName) { this.studentName = studentName; } public Student(String studentName, Set<Course> courses) { this.studentName = studentName; this.courses = courses; } public long getStudentId() { return this.studentId; } public void setStudentId(long studentId) { this.studentId = studentId; } public String getStudentName() { return this.studentName; } public void setStudentName(String studentName) { this.studentName = studentName; } public Set<Course> getCourses() { return this.courses; } public void setCourses(Set<Course> courses) { this.courses = courses; } }
package com.vaannila.student; // Generated May 30, 2009 6:48:40 AM by Hibernate Tools 3.2.4.GA /** * This class contains the course details. * */ public class Course implements java.io.Serializable { private long courseId; private String courseName; public Course() { } public Course(String courseName) { this.courseName = courseName; } public long getCourseId() { return this.courseId; } public void setCourseId(long courseId) { this.courseId = courseId; } public String getCourseName() { return this.courseName; } public void setCourseName(String courseName) { this.courseName = courseName; } }
package com.vaannila.student; import java.util.HashSet; import java.util.Set; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import com.vaannila.util.HibernateUtil; public class Main { public static void main(String[] args) { Session session = HibernateUtil.getSessionFactory().openSession(); Transaction transaction = null; try { transaction = session.beginTransaction(); Set<Course> courses = new HashSet<Course>(); courses.add(new Course("Maths")); courses.add(new Course("Computer Science")); Student student1 = new Student("Eswar", courses); Student student2 = new Student("Joe", courses); session.save(student1); session.save(student2); transaction.commit(); } catch (HibernateException e) { transaction.rollback(); e.printStackTrace(); } finally { session.close(); } } }
Создайте класс Main для запуска примера.
package com.vaannila.student; import java.util.HashSet; import java.util.Set; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import com.vaannila.util.HibernateUtil; public class Main { public static void main(String[] args) { Session session = HibernateUtil.getSessionFactory().openSession(); Transaction transaction = null; try { transaction = session.beginTransaction(); Set<Course> courses = new HashSet<Course>(); courses.add(new Course("Maths")); courses.add(new Course("Computer Science")); Student student1 = new Student("Eswar", courses); Student student2 = new Student("Joe", courses); session.save(student1); session.save(student2); transaction.commit(); } catch (HibernateException e) { transaction.rollback(); e.printStackTrace(); } finally { session.close(); } } }
При выполнении класса Main вы увидите следующий вывод.
Таблица STUDENT имеет две записи.
Таблица COURSE имеет две записи.
Таблица STUDENT_COURSE содержит четыре записи, чтобы связать студента и курсы.
Каждый студент записался на одни и те же два курса, это иллюстрирует сопоставление «многие ко многим».
Структура папок примера показана ниже.
Вы можете скачать исходный код этого примера здесь.