Hibernate 关联映射 多对多

来源:互联网 发布:手机淘宝进入二手市场 编辑:程序博客网 时间:2024/05/16 06:06
 

Hibernate 关联映射 多对多

多对多

多对多(teacher - student)

在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;Hibernate会为我们创建中间关联表,转换成两个一对多。

<set name="teacher" table="teacher_student">

              <key column="teacher_id"/>

              <many-to-many class="Student" column="student_id"/>

</set>

单向多对多

大学生和课程之间的关联就是多对多关联。

对应的持久化代码:

1)Course类

/**课程实体类*/

public class Course{

       private Long id;//对象标示符

       private String name;//姓名

       private Double creditHours;//课时数

       public Course(){}//无参构造方法

//以下为所有属性的getter和setter方法….

}

2)Student类

/**学生实体类*/

public class Student{

       private long id ;//对象标示符

       private String name;//姓名

       private String grade;//所在班级

       private Set<Course>coursep;//所有所选课程的集合

       public Student(){}//无参构造方法

//以下为所有属性的getter和setter方法

}

在关系模型中,是无法直接表达两个表之间的多对多的关联的。需要有一个中间的连接表,在连接表中用外键关联到两个表中。

上面两个持久化类的映射文件如下。

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>

</hibernate-mapping>

<!—映射持久化类-->

       <class name=”com.qiujy.domain.Course” table=”course”>

              <!—映射对象标示符-->

              <id name=”id” column=”id” type=”long”><generator class=”native”/></id>

              <!--映射普通属性-->

              <prooerty name=”name”/>

              <property name=”creditHours” column=”credit_Hours”/>

       </class>

</hibernate-mapping>

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”

<hibernate-mapping>

<!--持久化类-->

<class name=”com.qiujy.domian.Student” table=”student”>

< --映射标示符 -- >

<id name=”id” column=”id” type=”long”><generator class=”native”/></id>

       < -- 映射普通属性 -- >

       <property name=”name”/>

       <property name=”grade”/>

       <! –映射集合属性,指定连接表 -- >

       <set name=”course” table=”student_course”>

       < --用key元素指定本持久类在连接表中的外键名 -- >

       <key column=”student_id”/>

       <! – 映射多对多关联 -- >

       <many-to-many column=”course_id” class=”com.qiujy.domain.Course”/>

       </set>

       </class>

</hibernate-mapping>

在Student.hbm.xml类中用set映射了集合属性course,同时指定了中间的连接表是student_course表,指定了在连接表中Student的外键名实student_id,关联的是Course在连接表中的外建明是course_id。

双向多对多

对应的持久化类

/**学生实体类*/

pblic class Student{

private long id;//对象标示符

       private String name;//姓名

       private String grade;//所属班级

       private Set<Course> course;//所有所选课程的集合

       public Student(){}//无参构造方法

//以下为所有属性的getter和setter方法…..

}

Course类

/**课程实体类*/

 

public class Course{

private long id/对象标示符

       private String name;//课程名

       private Double creditHours;//课时数

       Private Set<Student> students;//选择了这门课程的学生的集合

       Public Course(){}//无参构造方法

//所有属性的getter和setter方法

}

这两个持久化类的映射文件

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>

<hibernate-mapping>

       < ! – 持久化映射类 -- >

       <class name=”com.qiujy.domain.Student” table=”student”>

       <! --- 映射对象标示符 --- >

       <id name=”id” column=”id” type=”long”><generator class=”native”/></id>

       <! ---映射普通属性 -- >

       <property name=”name”/>

       <property name=”grade”/>

       <!—映射集合属性,指定连接表 -- >

       <set name=”course” table=”student_course”>

       <! – 用key元素指定持久化类在连接表中的外键字段名 -- >

              <key column=”student_id”/>

              <!-- 映射多对多关联类 à

              <many-to-many column=”course_id” class=”com.qiujy.domain.Course”/>

       </set>

</class>

</hibernate-mapping>

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>

<hibernate-mapping>

<!—映射持久化类 -- >

<class name=”com.qiujy.domain.Course” table=”course”>

<! – 映射对象标示符 -- >

       <id name=”id” column=”id” type=”long”><generator class=”native”/></id>

       <! --映射普通属性 -->

       <property name=”name”/>

 

<property name=”creditHours” column=”credit_hours”/>

<!—映射集合属性,指定连接表 -- >

<set name=”student” table=”student_course” inverse=”ture”>

<! --用key元素指定持久化类在连接表中的外键字段名  -- >

<key column=”corse_id”/>

<!—映射多对多关联 -- >

<many-to-many column=”student-id” class=”com.qiujy.domain.Student”/>

</set>

</class>

</hibernate-mapping>

在双向多对多映射中,最好要在某一端的集合属性映射上设置inverse=”ture”,这样明确地告诉Hibernate,让另一端负责连接表的更新。这样会有更好地性能。

 

原创粉丝点击