一对多描述的是对象与集合的关系或者对象与对象之间的关系。
更准确的说:一对多描述的对象与集合之间的关系 即:在Classes类中set<Student>集合属性,多对一描述的是对象与对象的关系,即:在Student类中有一个Classes属性,两者之间就是对象与对象的关系
多对多描述的就是对象与集合之间的关系,每个类中都有一个集合装多的一方的类对象
多对多实例:老师与学生,学生与课程
多对多,数据库中得有三张表,第三张表和两个外键就是建立Student与Course的一个关联的
多对多的内连接查询
关系的维护
首先要明白什么叫做关系维护,比如一对多双向,代码只保存多的一方student,Classes是通过级联保存的
1、一对多的双向的关系维护(一般在多的一方维护)
当多的一方维护关系时,不会发出更新关系的update语句,而一的一方维护关系时
需要发出维护关系的update语句,所以在这里,一般情况下,多的一方维护关系效率
比较高。即:少了一条update 把外键更新到student表的sql语句
根据学生(多),添加班级(少),即:通过保存学生,把Classes对象放入放入Student的classes属性中,通过session.save(student)级联保存班级
多对多建立关系相当于在第三张表中插入一行数据
多对多解除关系相当于在第三张表中删除一行数据
多对多修改关系相当于先删除后增加
多对多谁维护效率都一样。看需求
明白sql语句怎么查询,就好理解映射文件的写法
持久化类:Student 学生
private Long sid;
private String name;
private String description;
private Set<Course> courses;
持久化类:Course
private Long cid;
private String name;
private String description;
private Set<Student> students;
持映射文件:Student.hbm.xml(这里指定了第三张表的两个外键)
注意:多对多要构造第三张表,来进行数据库的操作,
记住:映射文件中set元素,指定别的表的外键时,始终是该映射文件对应持久化类的表的主键
<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>
<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();
}
多对多建立关系相当于在第三张表中插入一行数据
多对多解除关系相当于在第三张表中删除一行数据
多对多修改关系相当于先删除后增加
多对多谁维护效率都一样。看需求