Hibernate-----一对多关联映射(映射文件方式)

一对多和多对一映射原理一致:都是在多的一端加入一个外键指向一的一端

区别在于维护的关系不同:

1、多对一维护的关系是多指向一的关系,若维护了多指向一的关系,加载多的时候就会把一加载上来

2、一对多维护的关系是一指向多的关系,若维护了一指向多的关系,加载一的时候就会把多加载上来

在一端维护关系存在缺陷(可用一对多双向关联映射,解决一端维护关系存在的缺陷):

1、因为多的一端Student不知道Classes的存在(也就是Student没有维护与Classes的关系);所以在保存Sudent的时候关系字段classes_id是为null的,若将该关系字段设为非空,则将无法保存数据

2、另外因为Student不维护关系,Classes维护关系,Classes就会发出多余的update语句,保证Classes和Student有关系,这样加载Classes的时候才可以把该Classes对应的学生加载上来

一、单向关联映射

One(维护端:Classes)

<?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 package="org.app.model">
    <class name="Classes" table="t_classes">
       <id name="id">
           <generator class="increment"/>
       </id>

       <property name="name"/>

       <!--  维护关系: -->
       <set name="students">
           <!-- 往多的一端加个外键 -->
           <key column="classes_id"></key>
           <one-to-many class="org.app.model.Student"/>
       </set>
    </class>
</hibernate-mapping>

To

Many(非维护端:Student)

<?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 package="org.app.model">
    <class name="Student" table="t_student">
       <id name="id">
           <generator class="increment"/>
       </id>
       <property name="name"/>
    </class>
</hibernate-mapping>
public void testOneToMany() {
       Session session = null;
       try {
           session = HibernateUtils.getSession();
           session.beginTransaction();

           // 关联有方向性,一对多(一依赖多),故先有Student、再有Classes
           Student student1 = new Student();
           student1.setName("name");
           session.save(student1);

           Student student2 = new Student();
           student2.setName("name");
           session.save(student2);

           Set<Student> set = new HashSet<Student>();
           set.add(student1);
           set.add(student2);

           Classese classes = new Classese();
           classes.setName("className");
           classes.setStudents(set);

           // 最后保存维护端
           session.save(classes);
           // 先插入两条student
           // 然后插入一条classes
           // 再修改两条student(用于维护关系)

           session.getTransaction().commit();
       } catch (Exception e) {
           e.printStackTrace();
           session.getTransaction().rollback();
       } finally {
           HibernateUtils.closeSession(session);
       }
    }

二、双向关联映射

One(维护端:Classes)

<?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 package="org.app.model">
    <class name="Classes" table="t_classes">
       <id name="id">
           <generator class="increment"/>
       </id>

       <property name="name"/>

       <set name="students"inverse=”true”>
         <!—加上inverse后该端不再维护关系,而是另外一端维护关系 -->
           <!-- 往多的一端加个外键 -->
           <key column="classes_id"></key>
           <one-to-many class="org.app.model.Student"/>
       </set>
    </class>
</hibernate-mapping>

To

Many(维护端:Student)

<?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 package="org.app.model">
    <class name="Student" table="t_student">
       <id name="id">
           <generator class="increment"/>
       </id>
       <property name="name"/>
       <!--  维护关系:在多的一端加外键 -->
       <many-to-one name="classes"column="classes_id"></many-to-one>
    </class>
</hibernate-mapping>

先保存一的一端再保存多的多的一端可避免多发update语句

inverse属性(默认false:本端可维护关系;true:本端不维护关系,交由另一端维护)可用在一对多和多对多双向关联上

一对多关联映射通常在多的一端维护关系,让一的一端失效(设置inverse=true)

inverse pk cascade

inverse是控制方向上的反转,只影响存储

cascade是操作上的连锁反应(同步关联的对象)

时间: 2024-11-06 09:25:20

Hibernate-----一对多关联映射(映射文件方式)的相关文章

Hibernate一对多关联映射的配置及其级联删除问题

首先举一个简单的一对多双向关联的配置: 一的一端:QuestionType类 package com.exam.entity; import java.util.Set; public class QuestionType { private String typeName; private char typeUniqueness; private Set quesion; public String getTypeName() { return typeName; } public void

03.Hibernate一对多关联

前言:在域模型中,类与类之间最普遍的关系就是关联关系,在UML语言中关联关系是有方向的.在数据库中表与表之间也会有关联关系,本节介绍通过Hibernate映射一对多的关联关系,这是一种最普遍的关联关系. 1.数据库表的一对多关联关系 (1)示例数据库表说明 本节使用两张表:tb_student(学生表).tb_class(班级表),一个班级里有多个学生,而一个学生只能在一个班级里,这样构成了学生与班级的多对一关联关系.下图表述了Student与Class之间的关系: (2)使用MySQL创建表

hibernate一对多关联

实体之间有三种关系: 1.一对一 2.一对多 3.多对一 一对多 goods类 package entity;/* * 货物表 * */public class goods { private int gid; private long gnum; private inventory inv; public int getGid() { return gid; } public void setGid(int gid) { this.gid = gid; } public long getGnu

Hibernate一对多单向关联和双向关联映射方法及其优缺点 (待续)

一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同.它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的同时加载多的一端的数据 多对一关联映射是指在加载多的一端数据的同时加载一的一端的数据 而单向一对多关联映射是在一的一端维护关系的,具有以下的缺点: 必须先保存多的一端后才可以保存一的一端,所以在保存多的一端时多的一端不知道一的一端是否 存在相应的数据,所以只能将维护的关系字段设置为null,如果为非空

【SSH系列】Hibernate映射 -- 一对多关联映射

    映射原理       一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入一个外键,指向一的一段,关联关系都是在多的一端进行维护,只是我们在写映射的时候发生了变化.       一对多和多对一的映射原理是一样的,但是她们之间也存在着小小的区别,毕竟世界上没有两片完全相同的叶子,她们之间的区别就是维护的关系不同,我们先来看多对一,多端维护一端的关系,在加载多端的时候,可以将一端

一步步学习Hibernate框架(四):采用jpa实现一对多关联映射(二)

上篇博客已经采用jpa注解来实现了一对多关联映射,将这种关联映射以外键的形式处理,现在来看看怎么以第三张表的形式处理.采用jpa注解来映射数据库要使用的jar包见上篇博客: 一步步学习Hibernate框架(三):采用jpa实现一对多关联映射(一) 现在看第二种方式:以第三张表的关系来体现 Group.java package com.tgb.zhudan; import java.util.List; import javax.persistence.CascadeType; import j

【SSH进阶之路】Hibernate映射——一对多关联映射(七)

上上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息. 上篇博文[SSH进阶之路]Hibernate映射--一对一双向关联映射(六),双向关联映射解决了单向关联映射只能从一端加载信息的缺陷,当然,双向关联映射并不影响存储,只影响加载.下面我们开始今天的内容: 一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,

hibernate之关于使用连接表实现一对多关联映射

[Hibernate]之关于使用连接表实现一对多关联映射 基于中间表实现的一对多的关联映射,还是比较常见的. Person(人)和Group(组) Annotations配置 @Entity @Table(name="t_group") publicclass Group {     private Integer id;     private String name;     private Set<Person> persons=newHashSet<Perso

Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)

One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotation) Many to Many 映射关系 多对多单向外键关联(XML/Annotation) 多对多双向外键关联(XML/Annotation) set的inverse元素详解 问题小结 关联关系的优缺点 多对一单向外键关联关系 注意多对一关联是多方持有一方的引用.看一个例子,去淘宝购物,那么一个