Hibernate关系映射之多对多关系

来源:互联网 发布:php全栈 视频 编辑:程序博客网 时间:2024/05/17 01:19

多对多关联有双向和单向之分,区别在于在POJO类中是否有Set属性。本文是双向关联。

第一步:创建数据库,设置好中文属性,然后创建三个表。

Student表:

列名

描述

数据类型

可空

默认值

说明

ID

ID号

int

主键,自增

SNUMBER

学号

varchar(10)

 

SNAME

姓名

varchar(10)

无 

 

SAGE

年龄

int


Course表:

列名

描述

数据类型

可空

默认值

说明

ID 

ID号

int 

主键,自增

CNUMBER 

课程号

varchar(10) 

 

CNAME 

课程名

varchar(20) 

stu_cour表:

列名

描述

数据类型

可空

默认值

说明

SID 

学生ID号

int 

主键

CID 

课程ID号

int 

主键

第二步:创建数据库连接驱动,打开MyEclipse DataBase Explorer Perspective视图,new,其中Driver Template=MySQL Connector/J,Driver Name=自定义,Connection URL=jdbc:mysql://localhost:3306/javaee?characterEncoding=gbk,User name=用户名,Password=密码。

第三步:创建Web Project,添加Hibernate开发能力(MyEclipse --> Add Hibernate Capabilites),即建立hibernate.cfg.xml文件。

第四步:创建POJO类和其映射文件,可以在打开连接后,对Student、Course表使用反向工程(Hibernate Reverse Engineering)。或者编辑每个文件。

Student.java

package org.model;import java.util.HashSet;import java.util.Set;/** * Student entity. @author MyEclipse Persistence Tools */public class Student implements java.io.Serializable {// Fieldsprivate Integer id;private String snumber;private String sname;private Integer sage;private Set courses = new HashSet(); //在Student类中增加Course集合并实现get/set// Constructors/** default constructor */public Student() {}/** minimal constructor */public Student(String snumber) {this.snumber = snumber;}/** full constructor */public Student(String snumber, String sname, Integer sage) {this.snumber = snumber;this.sname = sname;this.sage = sage;}// Property accessorspublic Integer getId() {return this.id;}public void setId(Integer id) {this.id = id;}public String getSnumber() {return this.snumber;}public void setSnumber(String snumber) {this.snumber = snumber;}public String getSname() {return this.sname;}public void setSname(String sname) {this.sname = sname;}public Integer getSage() {return this.sage;}public void setSage(Integer sage) {this.sage = sage;}public Set getCourses() {return courses;}public void setCourses(Set courses) {this.courses = courses;}}
Student.hbm.xml
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!--     Mapping file autogenerated by MyEclipse Persistence Tools--><hibernate-mapping>    <class name="org.model.Student" table="student" catalog="lab6">        <id name="id" type="java.lang.Integer">            <column name="ID" />            <generator class="identity" />        </id>        <property name="snumber" type="java.lang.String">            <column name="SNUMBER" length="10" not-null="true" />        </property>        <property name="sname" type="java.lang.String">            <column name="SNAME" length="10" />        </property>        <property name="sage" type="java.lang.Integer">            <column name="SAGE" />        </property>        <set name="courses" table="stu_cour" cascade="all" lazy="true">            <key column="SID"></key>            <many-to-many class="org.model.Course" column="CID" />        </set>    </class></hibernate-mapping>
Course.java
package org.model;import java.util.HashSet;import java.util.Set;/** * Course entity. @author MyEclipse Persistence Tools */public class Course implements java.io.Serializable {// Fieldsprivate Integer id;private String cnumber;private String cname;private Set stus = new HashSet(); //在Course类中增加Students集合并实现其get/set// Constructors/** default constructor */public Course() {}/** full constructor */public Course(String cnumber, String cname) {this.cnumber = cnumber;this.cname = cname;}// Property accessorspublic Integer getId() {return this.id;}public void setId(Integer id) {this.id = id;}public String getCnumber() {return this.cnumber;}public void setCnumber(String cnumber) {this.cnumber = cnumber;}public String getCname() {return this.cname;}public void setCname(String cname) {this.cname = cname;}public Set getStus() {return stus;}public void setStus(Set stus) {this.stus = stus;}}
Course.hbm.xml
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!--     Mapping file autogenerated by MyEclipse Persistence Tools--><hibernate-mapping>    <class name="org.model.Course" table="course" catalog="lab6">        <id name="id" type="java.lang.Integer">            <column name="ID" />            <generator class="identity" />        </id>        <property name="cnumber" type="java.lang.String">            <column name="CNUMBER" length="10" />        </property>        <property name="cname" type="java.lang.String">            <column name="CNAME" length="20" />        </property>        <set name="stus" table="stu_cour" lazy="true" cascade="all">         <key column="CID"></key>        <many-to-many class="org.model.Student" column="SID" />        </set>    </class></hibernate-mapping>

注意:在hibernate.cfg.xml中查看一下是否将POJO类映射。

<mapping resource="org/model/Course.hbm.xml"/><mapping resource="org/model/Student.hbm.xml"/>

第五步:创建测试类

Test.java

package org;import java.util.HashSet;import java.util.Set;import org.hibernate.Session;import org.hibernate.Transaction;import org.model.Course;import org.model.Student;import org.util.HibernateSessionFactory;public class Test {public static void main(String args[]) {Session session=HibernateSessionFactory.getSession(); //创建Session对象Transaction ts=session.beginTransaction(); // 创建事务对象Course cour1=new Course();Course cour2=new Course();Course cour3=new Course();cour1.setCnumber("101");cour1.setCname("计算机基础");cour2.setCnumber("102");cour2.setCname("数据库原理");cour3.setCnumber("103");cour3.setCname("计算机原理");Set courses=new HashSet();courses.add(cour1);courses.add(cour2);courses.add(cour3);Student stu=new Student();stu.setSnumber("221154");stu.setSname("李四");stu.setSage(21);stu.setCourses(courses); //将Course集合set给Student对象session.save(stu); //Session保存ts.commit(); //事务提交HibernateSessionFactory.closeSession(); //关闭Session}}
0 0