hibernate多表操作之多对多

来源:互联网 发布:淘宝医药商城 编辑:程序博客网 时间:2024/05/21 09:36

一对多描述的是对象与集合的关系或者对象与对象之间的关系。

更准确的说:一对多描述的对象与集合之间的关系 即:在Classes类中set<Student>集合属性,多对一描述的是对象与对象的关系,即:在Student类中有一个Classes属性,两者之间就是对象与对象的关系

多对多描述的就是对象与集合之间的关系,每个类中都有一个集合装多的一方的类对象

多对多实例:老师与学生,学生与课程


多对多,数据库中得有三张表,第三张表和两个外键就是建立Student与Course的一个关联


多对多的内连接查询



关系的维护

首先要明白什么叫做关系维护,比如一对多双向,代码只保存多的一方student,Classes是通过级联保存的

1、一对多的双向的关系维护(一般在多的一方维护)



在一的一方维护关系的时候,总会发出维护关系的update语句,该update语句就是更新外键

 

  当多的一方维护关系时,不会发出更新关系update语句,而一的一方维护关系时

需要发出维护关系的update语句,所以在这里,一般情况下,多的一方维护关系效率

比较高。即:少了一条update 把外键更新到student表的sql语句

 

根据学生(多),添加班级(少),即:通过保存学生,把Classes对象放入放入Student的classes属性中,通过session.save(student)级联保存班级




2、多对多的关系维护


多对多建立关系相当于在第三张表中插入一行数据

    多对多解除关系相当于在第三张表中删除一行数据

    多对多修改关系相当于先删除后增加

多对多谁维护效率都一样。看需求




   

明白sql语句怎么查询,就好理解映射文件的写法


 持久化类:Student 学生

public class Student implements Serializable{
private Long sid;
private String name;
private String description;

private Set<Course> courses;


 持久化类:Course

public class Course implements Serializable{
private Long cid;
private String name;
private String description;

private Set<Student> students;

 持映射文件:Student.hbm.xml(这里指定了第三张表的两个外键)

      注意:多对多要构造第三张表,来进行数据库的操作,

        记住:映射文件中set元素,指定别的表的外键时,始终是该映射文件对应持久化类的表的主键

<hibernate-mapping>
<class name="com.itheima12.hibernate.domain.Student">
<id name="sid" length="5">
<generator class="increment"></generator>
</id>
<property name="description" length="50"></property>
<property name="name" length="20"></property>
<!-- 
table
       第三张表

-->
<set name="courses" table="student_course" cascade="save-update">
<key>
<!-- 
外键
-->
<column name="sid"></column>

</key>
<!-- 
column外键
-->
<many-to-many class="com.itheima12.hibernate.domain.Course"column="cid"></many-to-many>
</set>
</class>
</hibernate-mapping>


 持映射文件:Course.hbm.xml(这里指定了第三张表的两个外键)


<hibernate-mapping>
<class name="com.itheima12.hibernate.domain.Course">
<id name="cid" length="5">
<generator class="increment"></generator>
</id>
<property name="description" length="50"></property>
<property name="name" length="20"></property>
<!-- 
table
       第三张表

-->
<set name="students" table="student_course">
<key>
<!-- 
外键
-->
<column name="cid"></column>
</key>

<!-- 
column外键
-->
<many-to-many class="com.itheima12.hibernate.domain.Student"column="sid"></many-to-many>
</set>
</class>
</hibernate-mapping>


客户端的操作

/**
* 保存学生的时候,同时保存课程
* Hibernate: 
   select  max(sid)  from  Student
Hibernate: 
   selec  max(cid)  from Course
Hibernate: 
   insert  into  Student  (description, name, sid)  values (?, ?, ?)
Hibernate: 
       
 在Student.hbm.xml文件中
      <set cascade="save-update">

   insert into Course  (description, name, cid)  values (?, ?, ?)
Hibernate: 
          建立关系的sql语句
   insert  into student_course (sid, cid) values(?, ?)


*/
@Test
public void testSaveStudent_Cascade_Save_Course(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();

Student student = new Student();
student.setName("aa");

Course course = new Course();
course.setName("java基础课程");

//建立学生与课程之间的关系
Set<Course> courses = new HashSet<Course>();
courses.add(course);
student.setCourses(courses);

session.save(student);

transaction.commit();
session.close();
}




多对多建立关系相当于在第三张表中插入一行数据

    多对多解除关系相当于在第三张表中删除一行数据

    多对多修改关系相当于先删除后增加

多对多谁维护效率都一样。看需求


0 0