1. 程式人生 > >dljd_(071-074)_hibernate_多對多關聯關係對映

dljd_(071-074)_hibernate_多對多關聯關係對映

一、多對多關聯關係對映

  多對多關聯關係對映其實就是兩個一對多關聯關係對映組成的。要用到中間表(中間表充當多方)

二、示例(一個學生可以選多門課程、一門課程可以被多個學生選)

  1.1定義學生實體

package edu.aeon.beans;

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

/**
 * [說明]:學生實體類
 * @author aeon
 *
 */
public class Student {
    private Integer stuId;
    private String stuName;
    
private Set<Course> courses; public Student() { courses=new HashSet<Course>(); } public Student(String stuName){ this(); this.stuName=stuName; } public Integer getStuId() { return stuId; } public void setStuId(Integer stuId) {
this.stuId = stuId; } public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } public Set<Course> getCourses() { return courses; } public void setCourses(Set<Course> courses) {
this.courses = courses; } @Override public String toString() { return "Student [stuId=" + stuId + ", stuName=" + stuName + ", courses=" + courses + "]"; } }

  1.2Student.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="edu.aeon.beans">
    <class name="Student" table="student">
        <id name="stuId">
            <column name="stuid" sql-type="int(3)"/>
            <generator class="native"/>
        </id>
        <property name="stuName">
            <column name="stuname" sql-type="varchar(16)"/>
        </property>
        <set name="courses" cascade="save-update" table="student_course">
            <key column="stuid"/>
        <many-to-many class="Course" column="cid" />
        </set>
    </class>
</hibernate-mapping>

1.3課程實體類(Course)

package edu.aeon.beans;

import java.util.HashSet;
import java.util.Set;
/**
 * [說明]:課程實體類
 * @author aeon
 *
 */
public class Course {
    private Integer cid;
    private String cname;
    private Set<Student> students;
    public Course() {
        this.students=new HashSet<Student>();
    }
    public Course(String cname) {
        this();
        this.cname = cname;
    }
    public Integer getCid() {
        return cid;
    }
    public void setCid(Integer cid) {
        this.cid = cid;
    }
    public String getCname() {
        return cname;
    }
    public void setCname(String cname) {
        this.cname = cname;
    }
    public Set<Student> getStudents() {
        return students;
    }
    public void setStudents(Set<Student> students) {
        this.students = students;
    }
    @Override
    public String toString() {
        return "Course [cid=" + cid + ", cname=" + cname + ", students=" + students + "]";
    }
}

  1.4Course.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="edu.aeon.beans">
    <class name="Course" >
        <id name="cid">
            <column name="cid" sql-type="int(3)"/>
            <generator class="native"/>
        </id>
        <property name="cname">
            <column name="cname" sql-type="varchar(16)"/>
        </property>
        <set name="students" cascade="save-update" table="student_course">
            <key column="cid"/>
        <many-to-many class="Student" column="stuid" />
        </set>
    </class>
</hibernate-mapping>

1.5將兩個實體註冊到主配置檔案中  

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- 配置資料庫的四要素 -->
        <property name="hibernate.connection.driver">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/db_test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <!-- 配置資料庫方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <!-- 配置資料庫連線池 -->
        <!-- <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property> -->
        <!-- 註冊當前session上下文 -->
        <property name="hibernate.current_session_context_class">thread</property>
        <!-- 自動建表 -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!-- 顯示sql -->
        <property name="hibernate.show_sql">true</property>
        <!-- 格式化sql -->
        <property name="hibernate.format_sql">true</property>
        <mapping resource="edu/aeon/beans/Student.hbm.xml"/>
        <mapping resource="edu/aeon/beans/Course.hbm.xml"/>
    </session-factory>
</hibernate-configuration>    

1.6測試類

  

package edu.aeon.hibernate.test;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import edu.aeon.aeonutils.hibernate.getsessionutil.GetSessionUtil;
import edu.aeon.beans.Course;
import edu.aeon.beans.Student;
/**    
 * [說明]:測試多對多關聯關係對映
 * @author aeon
 *
 */
public class TestMany2Many {
    @Test
    public  void testSave() {
        Session session=null;
        Transaction transaction=null;
        try {
            session = GetSessionUtil.getSession();
            transaction=session.getTransaction();
            transaction.begin();
            Course course1=new Course("c");
            Course course2=new Course("andriod");
            Course course3=new Course("java");
            Student student1=new Student("zhangsan");
            Student student2=new Student("lisi");
            student1.getCourses().add(course1);
            student1.getCourses().add(course3);
            student2.getCourses().add(course3);
            student2.getCourses().add(course2);
            session.save(student1);
            session.save(student2);
            transaction.commit();
        } catch (Exception e) {
            e.printStackTrace();
            transaction.rollback();
        }finally {
            if(null!=session){
                session.close();
            }
        }
    }
}

測試結果:

  

Hibernate: 
    
    create table Course (
        cid int(3) not null auto_increment,
        cname varchar(16),
        primary key (cid)
    )
Hibernate: 
    
    create table student (
        stuid int(3) not null auto_increment,
        stuname varchar(16),
        primary key (stuid)
    )
Hibernate: 
    
    create table student_course (
        stuid integer not null,
        cid integer not null,
        primary key (cid, stuid)
    )
Hibernate: 
    
    alter table student_course 
        add constraint FKh5wih1h6w7ou383ollpltc3o 
        foreign key (cid) 
        references Course (cid)
Hibernate: 
    
    alter table student_course 
        add constraint FK1psvvjefhfaxlelcr844pwttv 
        foreign key (stuid) 
        references student (stuid)
Hibernate: 
    insert 
    into
        student
        (stuname) 
    values
        (?)
Hibernate: 
    insert 
    into
        Course
        (cname) 
    values
        (?)
Hibernate: 
    insert 
    into
        Course
        (cname) 
    values
        (?)
Hibernate: 
    insert 
    into
        student
        (stuname) 
    values
        (?)
Hibernate: 
    insert 
    into
        Course
        (cname) 
    values
        (?)
Hibernate: 
    insert 
    into
        student_course
        (stuid, cid) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        student_course
        (stuid, cid) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        student_course
        (stuid, cid) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        student_course
        (stuid, cid) 
    values
        (?, ?)

測試結果截圖:

  

資料庫資料資訊:

 

  inverse賦值為true,表示一方放棄關聯關係(對應到資料庫中是不維護主外來鍵關係)的維護權。這是一方的特權,多方不具有。