Hibernate4 关联关系的映射案例

Hibernate集合映射与关联关系映射 本文主要讲解Hibernate的主键策略、Hibernate数据类型与Java数据类型关系、集合映射、关联关系映射。 阅读详情

Hibernate4 关联关系的映射案例

一对多、多对多、一对一的建表原则

一对多

如:一个用户,生成多个订单,每一个订单只能属于一个用户。
建表原则:
在多的一方创建一个字段,作为外键,指向一的一方的主键.

多对多

如:一个学生可以选择多门课程,一个课程可以被多个学生选择。
建表原则:
创建第三张表,中间表至少有两个字段,分别作为外键指向多对多双方主键.

一对一(特殊,应用很少)

一个公司只能有一个注册地址,一个注册地址,只能被一个公司使用(否则将两个表建到一个表)
建表原则:
* 唯一外键方式:一对一的双方,假设一方是多的关系,需要在多的一方创建一个字段作为外键,指向一的一方的主键。但是在外键添加一个unique。
* 主键对应方式:一对一的双方,通过主键进行关联。

案例

1. 需求描述:

  1. 设计一个数据库表结构,可以存储满足记录班级学生选课的信息记录;
  2. 一个班级可以有多个学生,一个学生可以选择多门课程;
  3. 添加如下表数据,session.save方法只操作student对象即可完成相关联的其他表数据
学生姓名所属班级所选课程
张三三年二班高等数学、物理
李四三年二班物理、英语
小丽三年四班高等数学、物理、英语
James三年四班高等数学
David三年二班高等数学、英语

2. 需求分析

设计三张表格,分别存储学生、课程、班级信息,其中:
学生表,主键sid,关联外键班级表-classid
课程表,主键cid,关联外键学生表-sid
班级表,主键classid。

学生表与课程表是多对多关系;
班级表与学生表是一对多关系;
班级表与课程表没有关系。

学生表与课程表的关联:生成一张中间表,分别使用学生表sid和课程表cid作为外键关联这两张表。
学生表与班级表的关联,在学生表中(一对多的多方)维护外键,添加外键关联到班级表的classid。

表结构及对象结构如下图所示。
表结构.jpg

3. 持久化对象类的定义

student.java

public class Student {
    private Integer sid;
    private String sname;
    private Classnum sclass;
    private Set<Course> courses = new HashSet<Course>();

    public Integer getSid() {
        return sid;
    }
    public void setSid(Integer sid) {
        this.sid = sid;
    }
    public String getSname() {
        return sname;
    }
    public void setSname(String sname) {
        this.sname = sname;
    }
    public Classnum getSclass() {
        return sclass;
    }
    public void setSclass(Classnum sclass) {
        this.sclass = sclass;
    }
    public Set<Course> getCourses() {
        return courses;
    }
    public void setCourses(Set<Course> courses) {
        this.courses = courses;
    }
}

Course.java

public class Course {
    private Integer cid;
    private String cname;
    private Set<Student> students = new HashSet<Student>();

    public Integer getCid() {
        return cid;
    }
    public void setCid(Integer cid) {
        this.cid = cid;
    }
    public String getCname() {
        return cname;
    }
    public void setCname(String cname) {
        this.cname = cname;
    }
    public Set<Student> getStudents() {
        return students;
    }
    public void setStudents(Set<Student> students) {
        this.students = students;
    }
}

classnum.java

public class Classnum {
    private Integer classid;
    private String classname;
    private Set<Student> students = new HashSet<Student>();

    public Integer getClassid() {
        return classid;
    }
    public void setClassid(Integer classid) {
        this.classid = classid;
    }
    public String getClassname() {
        return classname;
    }
    public void setClassname(String classname) {
        this.classname = classname;
    }
    public Set<Student> getStudents() {
        return students;
    }
    public void setStudents(Set<Student> students) {
        this.students = students;
    }
}

4. 映射配置文件

student.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.lim.user.domain">
    <class name="Student" table="student">
        <!-- 配置唯一标识 -->
        <id name="sid" column="sid">
            <!-- 主键生成策略 -->
            <!-- native: 本地策略,根据底层数据库不同,自动选择identity或sequence -->
            <generator class="native" />
        </id>

        <!-- 配置属性映射 -->
        <property name="sname" column="sname" type="java.lang.String" length="30" />

        <!-- 配置关联关系 -->
        <!-- 学生表和课程表是多对多的关系,生成的中间表名称是choose_course -->
        <set name="courses" table="choose_course" cascade="save-update">
            <!-- 当前表在中间表的外键列 -->
            <key column="sid" />
            <!-- class:另一方类的全路径. column:另一方在中间表中外键名称 -->
            <many-to-many class="cn.lim.user.domain.Course" column="cid" />
        </set>

        <!-- 班级表和学生表是一对多的关系,使用多方学生表维护外键 -->
        <!-- name:关联对象的java属性的名称.column:表中的外键名称.class:关联对象类的全路径-->
        <many-to-one name="sclass" column="classid" class="cn.lim.user.domain.Classnum" cascade="save-update"/>
    </class>
</hibernate-mapping>

course.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.lim.user.domain">
    <class name="Course" table="courses">
        <!-- 配置唯一标识 -->
        <id name="cid" column="cid">
            <!-- 主键生成策略 -->
            <!-- native: 本地策略,根据底层数据库不同,自动选择identity或sequence -->
            <generator class="native" />
        </id>

        <!-- 配置属性映射 -->
        <property name="cname" column="cname" type="java.lang.String" length="30" />

        <!-- 配置关联关系 -->
        <!-- 学生表和课程表是多对多的关系 -->
        <!-- name是本java对象保存对方表对象的属性,生成的中间表名称是choose_course,inverse:课程是被动方,放弃外键的维护权以避免产生多余sql -->
        <set name="students" table="choose_course" cascade="save-update" inverse="true">
            <!-- 当前表在中间表的外键列 -->
            <key column="cid" />
            <!-- class:另一方类的全路径. column:另一方在中间表中外键名称 -->
            <many-to-many class="cn.lim.user.domain.Student" column="sid" />
        </set>
    </class>
</hibernate-mapping>

classnum.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.lim.user.domain">
    <class name="Classnum" table="class">
        <!-- 配置唯一标识 -->
        <id name="classid" column="classid">
            <!-- 主键生成策略 -->
            <!-- native: 本地策略,根据底层数据库不同,自动选择identity或sequence -->
            <generator class="native" />
        </id>

        <!-- 配置属性映射 -->
        <property name="classname" column="classname" type="java.lang.String" length="30" />

        <!-- 配置多表级联 -->
        <!-- 班级表和学生表是一对多的关系 -->
        <!-- name是本java对象保存对方表对象的属性 -->
        <set name="students" cascade="save-update" inverse="true">
            <!-- 多方的外键的名称(学生表中的classid) -->
            <key column="classid" />
            <!-- 另一方类的全路径 -->
            <one-to-many class="cn.lim.user.domain.Student" />
        </set>
    </class>
</hibernate-mapping>

5. 几个属性选项

级联属性cascade的取值:
- none:不使用级联
- dave-update:保存或更新的时候级联
- delete:删除的时候级联
- all:除了孤儿删除以外的所有级联.
delete-orphan:孤儿删除(孤子删除).
* 仅限于一对多.只有一对多时候,才有父子存在.认为一的一方是父亲,多的一方是子方.
* 当一个客户与某个订单解除了关系.将外键置为null.订单没有了所属客户,相当于一个孩子没有了父亲.将这种记录就删除了。

  • all-delete-orphan:包含了孤儿删除的所有的级联.

具体在哪里配置级联属性?
如,只想session.save(Object1)时,Object2就被自动关联保存,那么在Object1的级联配置下使用cascate属性。

外键弃权inverse的取值
- true:在哪一端配置,那么哪一端放弃了外键的维护权。

多对多必须有一方放弃外键的维护权,否则会报错。一般情况下,被动的一方去放弃,如学生表和课程表,学生选课,因此学生主动,课程被动。
一对多最好有一方放弃外键的维护权,否则会产生多余的sql语句,影响性能。一般情况下一的一方放弃维护权。

lazy属性和fetch属性的取值
在一的一方关联多的一方:在<set>标签下配置。
fetch属性控制sql语句的类型,其取值有:
* join:发送迫切左外连接的SQL查询关联对象。如果fetch=“join”,那么lazy被忽略。
* select :默认值,发送多条SQL查询关联对象。
* subselect:发送子查询查询关联对象。(需要使用Query接口测试)

lazy属性控制关联对象的检索是否采用延迟,其取值有:
* true:默认值,查询关联对象的时候使用延迟检索
* false:查询关联对象的时候不使用延迟检索
* extra:及其懒惰

在多的一方关联一的一方:在<many-to-one>标签下配置。
fetch属性控制sql语句的类型,其取值有:
* join:发送迫切左外连接的SQL查询关联对象。如果fetch=“join”,那么lazy被忽略。
* select :发送多条SQL查询关联对象。

lazy属性控制关联对象的检索是否采用延迟,其取值有:
* false:不延迟
* proxy:使用代理.检索订单额时候,是否马上检索客户,由Customer对象的映射文件中class标签上的lazy属性来决定。
* no-proxy:不使用代理

Hibernate关联关系(一对多) Hibernate关联关系(一对多)代码的具体实现,包括保存班级;保存学生;保存班级的时候同时保存学生;已经存在一个班级,新建一个学生,并且建立该学生和该班级之间的关系等一对多关系的情况。不足之处还望谅解 立即下载

相关推荐

hibernate关联关系多对一实例

hibernate关联关系多对一实例

类的关联关系及案例详解

类的关联关系及案例详解

qqrrjj2011的博客 2374

PCIe扫盲(三)

需要特别注意的是,PCIe的Spec中明确规定只有Root有权限发起配置请求(Originate Configuration Requests),也就是说PCIe系统里面的其他设备是不允许去配置其他设备的配置空间的,即peer-to-peer的配置请求是不允许的。当配置请求进行BDF路由的时候,正是依靠这些信息来确定要找的设备的。前面的文章还介绍过,Root和Switch的每一个端口中都包含一个P2P桥,并且知道桥的配置空间头(Configuration Space Header)是Type1型的。

Liuqz2009的专栏 2398

关联关系和依赖关系

1、  关联关系 类A关联类B的意思是,如果实例化一个A类的对象,同时,会有一个B类的对象被实例化。简言之,B作为A的属性存在。如下: [java] view plain copy   class A{          private B b;   }   class B{       }   2、 

代码小菜鸟的博客 8956

Jetson设备EXT4文件系统修复实战:从superblock损坏到系统恢复

本文详细介绍了Jetson设备因异常断电等原因导致EXT4文件系统superblock损坏后的诊断与修复实战。通过从健康设备移植fsck工具、使用备份超级块等步骤,指导用户逐步恢复系统,并提供了数据备份与预防措施,帮助用户有效应对嵌入式AI开发中的存储故障。

theta的博客 590

Meta-World环境实战解析:pick-place-v2中的状态观测与动作控制

本文深入解析了Meta-World中pick-place-v2环境的强化学习实战要点。文章详细拆解了39维状态观测向量的构成与意义,包括机械臂末端、物体位置及目标坐标,并揭示了默认部分可观测设置的潜在影响。同时,阐述了4维动作空间的控制逻辑与奖励函数的分阶段设计,为训练高效稳定的抓放策略提供了核心指导与实用调优技巧。

weixin_29184371的博客 76

经典的一对一关联关系,一对多关联关系有哪些

夫妻关系,一对一 人和身份证号,一对一 用户和手机号 一对多 爸爸和儿子 一对多 班级和学生 一对多 学校和学生 一对多 部门和员工 一对多 订单和网单 一对多 ...

enthan809882的博客 3693

潜流式人工湿地计算_复合人工湿地净化水产养殖污水技术

技术概论1. 定义与分类人工湿地是指用人工筑成水池或沟槽,底面铺设防渗漏隔水层,充填一定深度的基质层,种植水生植物,利用基质、植物、微生物的物理、化学、生物三重协同作用使污水得到净化的系统。当池塘养殖污水进入人工湿地时,其污染物被床体吸附、过滤、分解而达到水质净化作用。按照水体流动方式,人工湿地分为表面流人工湿地、水平潜流人工湿地、垂直潜流人工湿地以及由前面几种湿地混合搭配的组合式人工湿...

weixin_42365490的博客 4244

一对一关联关系实例

项目的文件结构: HibernateSessionFactory.java package addHibFile; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.omg.CORBA.PRIVATE_MEMBE...

monkey_wei的博客 3496

如何通过常规测井曲线识别砂岩、泥岩、碳酸盐岩和煤层

常规测井曲线通过不同岩性的物理性质差异识别砂岩、泥岩、碳酸盐岩和煤层。砂岩表现为低自然伽马(GR)、中等密度(RHOB)和声波时差(DT);泥岩以高GR、高中子(NPHI)和高DT为特征;碳酸盐岩显示低GR、高RHOB和低DT;煤层则具有极低RHOB、极高NPHI和DT的独特组合。综合GR与三孔隙度曲线(RHOB、NPHI、DT)可有效区分岩性,其中密度测井对煤层识别最可靠。电阻率(RT)曲线辅助判断流体性质,但需结合其他参数综合分析。

love code, love life. 2590

光电振荡器(OEO):从原理到应用,解锁高频微波信号新纪元

本文深入解析了光电振荡器(OEO)的核心原理与前沿应用。OEO通过巧妙的光-电-光转换机制,利用光学谐振腔产生高频、高纯度、低相位噪声的微波信号,有效突破了传统电子电路的频率瓶颈。文章详细拆解了其工作流程,并探讨了在雷达系统、高速光通信及精密测量等领域的硬核应用价值。

weixin_29231027的博客 364

Hibernate注解版关联关系映射全解析+案例

HIbernate注解说明 [java] view plain copy   1、@Entity(name="EntityName")   必须,name为可选,对应数据库中一的个表,此处的EntryName要注意,在代码中使用hql进行查询时,需要from Xxx,那么Xxx就是对应的此处的EntryName,所以要注意EntryName的命名,否

行走的IT 6438

论文阅读:ICLR 2026 Breaking and Fixing Defenses Against Control-Flow Hijacking in Multi-Agent Systems

该论文首先系统阐述了控制流劫持攻击的核心机理。此类攻击通过操纵多智能体系统的编排机制,诱导系统执行非安全操作,进而实现敏感信息窃取。攻击者将恶意指令伪装成环境错误信息,借助可信代理传递至系统编排器,利用"困惑副手"漏洞绕过传统安全防线。该论文指出,现有防御方案如LlamaFirewall所依赖的对齐检查机制存在根本性局限——安全目标与功能需求之间存在不可调和的内在冲突。该论文的核心贡献体现在攻防两个维度。

CSPhD-winston的博客 493

Hibernate 映射实体Bean的关联关系

Hibernate映射实体存在一对一、一对多、多对一、多对多的关联关系。 一、一对一(@OneToOne) 使用 @OneToOne 注解可以建立实体Bean之间的一对一关系。一对一关系有3种情况。 1:关联的实体都共享同样的主键 @Entity public class Body { @Id public Long getId() { return id; } @OneT

小小布的程序世界 2188

Agent驱动电商运营:从选品到售后的全链路革新

在当今竞争激烈的电商市场中,传统的电商运营模式面临着诸多挑战。从选品到售后,每个环节都需要大量的人力投入和专业知识。选品需要深入了解市场趋势和消费者需求,营销需要精准定位目标用户,客服需要24小时响应用户咨询。这些工作不仅耗时耗力,而且容易受到人为因素的影响,导致效率低下和成本高企。AI Agent是一种能够感知环境、做出决策并采取行动的智能系统。感知能力:能够获取和处理环境信息。决策能力:能够根据感知到的信息做出决策。行动能力:能够执行决策,对环境产生影响。学习能力。

AI 领航者的博客 354

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

hibernate关联关系映射总结

这里主要是为了自己梳理学习的知识,重在理解不是代码实践。 第一问:关联关系映射干什么用的? hibernate给我们提供的就是ORM功能,我们通过组织对象(包含私有对象)配置xml文件让hibernate帮助我们完成,类与类的关系映射到到数据库中表与表之间。 第二问:关联关系有那些呢? 单向一对一,双向一对一,单向一对多,单向多对一,双向一对多,单向多对多,双向多对多。 (双向一对多,多对一没...

阿福的时光机 286

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Hibernate的关联关系映射

Hibernate的关联关系映射 (注:以下描述适合hibernate3.1 版本) 前言以下所有描述以选课系统这个案例来说明。在一个选课系统中,基本的对象有课题(Course)、教师(Teacher)和学生(Student)。 一、一对一关联(有共享主键关联和惟一外键关联两种)1、共享主键关联 比如课题是由教师去任教,没有教师就没有课题,这

剑心博客 1697

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Hibernate 3.2 学习笔记 映射实体关联关系

映射实体关联关系一 映射 一对一组件类是没有OID没有对应的表 生命周期也依赖于其他的对象两种方法 1 按照外键映射2 按照主键映射1 按照外键映射定义一个或多个外键 参照 其他表的主键例子 Customer和AddressCustomer.hbm.xml  xml version="1.0"?>DOCTYPE hibernate-mapping PUBLIC     

Vincent的造轮子经验 2096

Hibernate 框架学习——多对多关联关系映射

多对多关联关系映射 多对多的实体关系模型也是很常见的,比如学生和课程的关系。一个学生可以选修多门课程,一个课程可以被多名学生选修。在关系型数据库中对于多对多关联关系的处理一般采用中间表的形式,将多对多的关系转化成两个一对多的关系。 为了详细介绍多对多关联关系映射,终究还是应以一个例子来说明比较印象深刻。我们以老师和学生的关系为例来说明这种多对多关联关系映射。 双向多对多 我们最好新建...

热心网友 294

hibernate关联关系映射

本文将以实例的形式介绍hibernate的几种关联关系映射:多对一、一对一、一对多、多对多。

ado1986的专栏 824

Hibernate:关联关系映射&继承映射

1,关联关系映射 单向关系:只需单向访问关联端。例如:只能通过老师访问学生或只能通过学生访问老师。包括:单向N-1、单向1-N、单向1-1、单向N-N。 双向关系:关联的两端可以访问。如老师和学生可以互相访问。包括:双向1-1、双向1-N、双向N-N。双向关系里没有N-1,因为双向关系1-N和N-1是完全相同。 1.1,单向N-1映射关系 【映射原理】多的一端维护关联关系,在“多”的一端加入一个外键,指向“一”的一端。单向 N-1 关联只需从 N 的一端可以访问 1 的一端,hibernate

燕双嘤 632

05.Hibernate中的关联关系映射,对象查询,二级缓存

05.Hibernate中的关联关系映射,对象查询,二级缓存 1、关联关系映射 同表 组件配置 不同表 一对一关联映射 多对一 一对多 多对多 2、对象查询 OID get: load: HQL(面向对象的查询语句) 条件查询 投影查询(只查询结果中的部分内容) 不封装对象 封装对象 分页查询 setFirstReult:查询的起始位置 setMaxResult:查询的内容数量 连接查询 迫切 因为结果数量对标了普通查询结果,所以需要去重复 非迫切 内联、左外连接、右外连接、全连接、交叉链接 报表

ycjcson的博客 1543

Hibernate关联关系映射配置

1、配置多对一单向映射    //对 tab_people表进行配置,factory表不用配置 &lt;hibernate-mapping&gt;   &lt;class name="com.mr.people.People" table="tab_people"&gt;   &lt;!-- id值 --&gt;   &lt;id name="id" column="id&q

Carry_Jey 1001

JavaEE第七次实验——Hibernate关联关系映射

实验七 Hibernate关联关系映射——登录用户的地址管理 一、基础实验——多对一/一对多关联 (一)实验目的 掌握 Hibernate 关联关系映射的基本概念,理解关联的方向和数量,重点理 解双向一对多/多对一的关联关系,及其在实际应用中的体现; 学习 Hibernate 框架处理一对多/多对一关联关系的方法,掌握关联关系中持 久化类的实现方法、以及相应 Hibernate 映射文件的配置方案; 能在实际应用中通过 Hibernate 建立正确的一对多/多对一关联关系映射,并 以面向对象的方式进行数据

qq_46015650的博客 790
上一篇: Hibernate 4.3.11快速入门案例
下一篇: log4j配置级别无效控制台狂刷debug信息
empty0.0
博客等级 码龄19年 20粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值