dljd_(071-074)_hibernate_多對多關聯關係對映
阿新 • • 發佈:2018-12-17
一、多對多關聯關係對映
多對多關聯關係對映其實就是兩個一對多關聯關係對映組成的。要用到中間表(中間表充當多方)
二、示例(一個學生可以選多門課程、一門課程可以被多個學生選)
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,表示一方放棄關聯關係(對應到資料庫中是不維護主外來鍵關係)的維護權。這是一方的特權,多方不具有。