Hibernate框架学习之四:关联映射那些事

简介:

前言

Hibernate关联关系与客观世界中具体的映射关系很类似,在进行数据库设计的时候常常需要考虑是一对多、多对一等类似的映射关系,这其中涉及数据库设计方面的知识。映射关系可以分为单向与双向两种,具体又包括一对多、多对一、一对一以及多对多四种。所以总共有八种映射关系。这里只介绍了XML配置文件的版本。

下面的配置文件的配置方式都以下面的两个持久化类作为模板:

public class Person {

    private int id;
    private String name;
    private int age;
    //省略set与get方法   
}
public class Address {

    private int id;
    private String province;
    private String city;
    //省略set与get方法
}
AI 代码解读

关联映射详细配置

/**
        1.多对一单向关联
        <!-- 使用多对一单向非连接表关联 -->
        <many-to-one name="address" class="Address" column="address_id" cascade="all"/>
        <!-- 使用多对一单向连接表关联 -->
        <join table="t_person_address">
            <key column="person_id"></key>
            <!-- 使用多对一单向连接表关联 -->
            <many-to-one name="address" class="Address" 
                column="address_id" cascade="all"/>
        </join>
        2.一对一单向关联
        2.1 基于外键的单向一对一关联
        <!-- 使用一对一单向无连接表关联 -->
        <many-to-one name="address" class="Address" 
            column="address_id" cascade="all" unique="true"/>
        <!-- 使用一对一单向连接表关联 -->
        <join table="t_person_address">
            <key column="person_id"></key>
            <!-- 使用一对一单向连接表关联 -->
            <many-to-one name="address" class="Address" 
                column="address_id" cascade="all" unique="true"/>
        </join>
        2.2 基于主键的单向一对一关联
        <id name="id" column="person_id" type="integer">
            <!-- <generator class="identity" /> -->
            <!-- 采用主键关联的时候,外键策略是foreign,
                表明根据关联类主键生成该实体的主键,持久化类本身不能拥有自己的主键生成策略
             -->
             <generator class="foreign">
                <param name="property">address</param>
             </generator>
        </id>
        <!-- 基于主键的一对一关联 -->
        <one-to-one name="address"></one-to-one>
        3.一对多单向关联
        <!-- 一对多的单向无连接表关联 -->
        <set name="addresses" table="t_address" cascade="all">
            <key column="person_id" not-null="true"></key>
            <one-to-many class="Address"/>
        </set>
        <!-- 一对多的单向连接表关联 -->
        <set name="addresses" table="t_person_address" cascade="all">
            <key column="person_id" not-null="true"></key>
            <many-to-many class="Address" column="address_id" unique="true"></many-to-many>
        </set>
        4.多对多单向关联
        <!-- 多对多的单向连接表(必须使用连接表)关联 -->
        <set name="addresses" table="t_person_address" cascade="all">
            <key column="person_id" not-null="true"></key>
            <many-to-many class="Address" column="address_id"></many-to-many>
        </set>
        5.一对多双向关联(一般使用无连接表的较多)[附:对于一对多推荐使用双向关联,因为单向关联会使用额外的update语句,影响性能]
        <!-- 一对多无连接表关联 -->
            下面是1的一端:
            <set name="addresses" inverse="true">
                <key column="person_id"></key>
                <one-to-many class="Address"/>
            </set>
            N的一端:
            <!-- 一对多双向无连接表关联
                column="person_id"与1的一端的主键列名是一致的
             -->
            <many-to-one name="person" class="Person" 
                column="person_id" not-null="true"/>
        <!-- 一对多连接表关联 -->
            下面是1的一端:
            <set name="addresses" table="t_person_address" inverse="true">
                <key column="person_id"></key>
                <many-to-many class="Address" column="address_id" unique="true"></many-to-many>
            </set>
            N的一端:
            <!-- 多对多连接表关联 -->
            <join table="t_person_address">
                <key column="address_id"></key>
                <many-to-one name="person" class="Person" 
                column="person_id" not-null="true"/>
            </join>
        6.多对多双向关联
        需要注意的是,两个集合的key与many元素的column的名称必须交叉相同
        <!-- 多对多双向关联(只能使用连接表) -->
        <set name="addresses" table="t_person_address" cascade="all" inverse="true">
            <key column="person_id"></key>
            <many-to-many class="Address" column="address_id"></many-to-many>
        </set>
        <!-- 多对多连接表关联(只能使用连接表进行关联) -->
        <set name="persons" table="t_person_address" cascade="all">
            <key column="address_id" ></key>
            <many-to-many column="person_id" class="Person"></many-to-many>
        </set>
        7.一对一双向关联
        7.1 基于外键双向关联
        <!-- 一对一双向外键关联 -->
        <one-to-one name="address" property-ref="person"></one-to-one>
        <!-- 一对一双向外键关联 -->
        <many-to-one name="person" unique="true" 
            column="person_id" not-null="true"></many-to-one>
        7.2 基于主键双向关联
        <!-- 一对一主键关联 -->
        <one-to-one name="address"></one-to-one>
        <!-- 基于主键关联,使用策略为foreign(类是Address) -->
            <generator class="foreign">
                <param name="property">person</param>
            </generator>
            <!-- 一对一主键关联 -->
            <one-to-one name="person"></one-to-one>
     */
AI 代码解读

以上就是各种映射关系的详细配置了,在开发中需要掌握的就是这么多了。

相关文章
框架分析(9)-Hibernate
框架分析(9)-Hibernate
Hibernate:Java持久层框架的高效应用
通过上述步骤,可以在Java项目中高效应用Hibernate框架,实现对关系数据库的透明持久化管理。Hibernate提供的强大功能和灵活配置,使得开发者能够专注于业务逻辑的实现,而不必过多关注底层数据库操作。
39 1
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
85 1
Struts 2 与 Hibernate 的完美邂逅:如何无缝集成两大框架,轻松玩转高效 CRUD 操作?
【8月更文挑战第31天】本文通过具体示例介绍了如何在 Struts 2 中整合 Hibernate,实现基本的 CRUD 操作。首先创建 Maven 项目并添加相关依赖,接着配置 Hibernate 并定义实体类及其映射文件。然后创建 DAO 接口及实现类处理数据库操作,再通过 Struts 2 的 Action 类处理用户请求。最后配置 `struts.xml` 文件并创建 JSP 页面展示用户列表及编辑表单。此示例展示了如何配置和使用这两个框架,使代码更加模块化和可维护。
222 0
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
115 0
探索JPA生态:Hibernate与其他ORM框架的对比分析
【6月更文挑战第25天】**JPA标准下的Hibernate是流行的ORM实现,提供丰富功能如二级缓存和延迟加载,但其学习曲线较陡,性能优化复杂。相比如MyBatis,Hibernate的JPQL更面向对象,MyBatis则接近SQL。选择ORM需考虑项目需求和个人偏好。**
121 0
杨老师课堂之JavaEE三大框架Hibernate入门第一课
杨老师课堂之JavaEE三大框架Hibernate入门第一课
51 0
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
102 1
数据库访问:什么是Hibernate框架?
【4月更文挑战第15天】Hibernate是开源ORM框架,将Java对象与数据库表映射,简化对象-关系映射,提升开发效率和性能。它自动化处理数据操作,支持多种数据库,自动生成SQL,提供配置选项和高级特性,减少手动SQL编写,便于切换数据库。
87 2
|
10月前
|
Java一分钟之-Hibernate:ORM框架实践
【5月更文挑战第15天】Hibernate是Java的ORM框架,简化数据库操作。本文列举并解决了一些常见问题: 1. 配置SessionFactory,检查数据库连接和JDBC驱动。 2. 实体类需标记主键,属性映射应匹配数据库列。 3. 使用事务管理Session,记得关闭。 4. CRUD操作时注意对象状态和查询结果转换。 5. 使用正确HQL语法,防止SQL注入。 6. 根据需求配置缓存。 7. 懒加载需在事务内处理,避免`LazyInitializationException`。理解和避免这些问题能提升开发效率。
93 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等