hibernate 多对多 最佳实践

简介:

首先 看看我们 ER 画画 :盖  一对一 。一对多 。多对多 的关系



对多 在 hibernate 中的 实现 :  一个 用户user ,拥有 多个角色 role。 一个 角色 属于 多个 用户user

事实上 多对多 就 是双向的 一对多。我们使用一个 中间表 user_role 来保存 user ,role 的 主键,来 确定 它们的 关联关系,

降低 数据的低级冗余。提高 可扩展 性


User.java 及 映射文件

public class User implements java.io.Serializable {
    private static final long serialVersionUID = 1636556781734875928L;
    private Long id;
    private String username;
    private String password;
    private String state;
    private Date createTime;

    private IdCard idCard;
    private Set<UserLog> userLogs;
    private Set<Role> roles;
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.eliteams.quick4j.test.study.hibernate.example">
    <class name="User" table="user">
        <id name="id" type="java.lang.Long">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="username" type="string">
            <column name="username" length="50">
            </column>
        </property>
        <property name="password" type="string">
            <column name="password" length="64">
            </column>
        </property>
        <property name="state" type="string">
            <column name="state" length="32">
            </column>
        </property>
        <property name="createTime" type="timestamp">
            <column name="create_time" length="19">
            </column>
        </property>

        <one-to-one name="idCard" cascade="all">
        </one-to-one>

        <set name="userLogs" inverse="true" cascade="delete">
            <key column="user_id"></key>
            <one-to-many class="UserLog" />
        </set>

        <set name="roles" table="user_role" cascade="save-update">
            <key column="user_id"></key>
            <many-to-many column="role_id" class="Role"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

Role.java 及 映射文件

import java.util.Set;

public class Role implements java.io.Serializable {
    private static final long serialVersionUID = -5094780060641842069L;
    private Long id;
    private String roleName;
    private String roleSign;
    private String description;
    private Set<User> users;
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.eliteams.quick4j.test.study.hibernate.example">
    <class name="Role" table="role" catalog="quick4j">
        <id name="id" type="java.lang.Long">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="roleName" type="string">
            <column name="role_name" length="32">
            </column>
        </property>
        <property name="roleSign" type="string">
            <column name="role_sign" length="128">
            </column>
        </property>
        <property name="description" type="string">
            <column name="description" length="256">
            </column>
        </property>

        <set name="users" table="user_role" inverse="true">
            <key column="role_id"></key>
            <many-to-many column="user_id" class="User"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

多对多 最佳实践:

我们能够把 user 看成 主表, role 看成 从表。

在 主表 user 多对多中 设置  cascade="save-update" ,表明 在 新增或 更改 user 的 时候 会级联 操作role。



新增 一个 用户 user。和他的role, hibernate 是 先 插入 user , 在 插入 role ,然后再 中间表 加入 数据;

而在删除user 中 ,则 仅仅删除中间表 和 user

 


这不正是我们想要的吗, 

我们 当然不想在 删除 一个 用户user  的时候 把 它 相应的 角色 role 删除。由于  这个 角色 role 可能 是其它 用户的 角色。

仅仅要解除 关系 就可以;

而在角色 role 中。我们设置 inverse="true" ,放弃维护 关系,由于 我们通常是 为 用户 user 分配 角色 role ,降低不必要的更新语句。


到这里 讲完了 一对一 。一对多 ,多对多的关系  映射 及 一些比較好的 配置。 应该 依据 业务 。灵活应用 hibernate 。hibernate 是 一个 很 好的orm 映射框架。

在 我 看来 比 mybatis 更 灵活 , 更 高效 ,前提 是 你 要熟练 它, 兴许 有时间会 将 一些 hibernate 优化 有关 操作。


版权声明:本文博客原创文章,博客,未经同意,不得转载。






本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4707795.html,如需转载请自行联系原作者


相关文章
|
1月前
|
Java 数据库连接 API
解锁高效开发秘籍:深入探究 Hibernate 如何优雅处理一对多与多对多关系,让数据映射再无烦恼!
【9月更文挑战第3天】Hibernate 是 Java 领域中最流行的 ORM 框架之一,广泛用于处理实体对象与数据库表之间的映射。尤其在处理复杂关系如一对多和多对多时,Hibernate 提供了丰富的 API 和配置选项。本文通过具体代码示例,展示如何使用 `@OneToMany`、`@JoinColumn`、`@ManyToMany` 和 `@JoinTable` 等注解优雅地实现这些关系,帮助开发者保持代码简洁的同时确保数据一致性。
28 4
|
1月前
|
SQL Java 数据库连接
Hibernate 批量操作来袭!掌握最佳实践,轻松应对数据洪流,开启高效开发新时代
【9月更文挑战第3天】在软件开发中,高效数据操作至关重要。作为流行的Java持久化框架,Hibernate提供了强大的数据库操作功能。本文探讨了Hibernate批量操作,包括批量插入、更新和删除的最佳实践,通过使用原生SQL和`Session`的`createNativeQuery()`方法,结合`addBatch()`及`executeBatch()`方法实现高效批量操作。合理设置批量大小、事务管理和性能测试是优化的关键。在实际开发中,应根据业务需求和性能要求选择合适的方法,以提升程序性能和可维护性。
67 3
|
2月前
|
Java 数据库连接 数据库
AI 时代风起云涌,Hibernate 实体映射引领数据库高效之路,最佳实践与陷阱全解析!
【8月更文挑战第31天】Hibernate 是一款强大的 Java 持久化框架,可将 Java 对象映射到关系数据库表中。本文通过代码示例详细介绍了 Hibernate 实体映射的最佳实践,包括合理使用关联映射(如 `@OneToMany` 和 `@ManyToOne`)以及正确处理继承关系(如单表继承)。此外,还探讨了常见陷阱,例如循环依赖可能导致的无限递归问题,并提供了使用 `@JsonIgnore` 等注解来避免此类问题的方法。通过遵循这些最佳实践,可以显著提升开发效率和数据库操作性能。
64 0
|
2月前
|
SQL 数据库 Java
Hibernate 日志记录竟藏着这些秘密?快来一探究竟,解锁调试与监控最佳实践
【8月更文挑战第31天】在软件开发中,日志记录对调试和监控至关重要。使用持久化框架 Hibernate 时,合理配置日志可帮助理解其内部机制并优化性能。首先,需选择合适的日志框架,如 Log4j 或 Logback,并配置日志级别;理解 Hibernate 的多级日志,如 DEBUG 和 ERROR,以适应不同开发阶段需求;利用 Hibernate 统计功能监测数据库交互情况;记录自定义日志以跟踪业务逻辑;定期审查和清理日志避免占用过多磁盘空间。综上,有效日志记录能显著提升 Hibernate 应用的性能和稳定性。
38 0
|
4月前
|
缓存 Java 数据库连接
Java开发者必备:Hibernate与JPA在企业级应用中的最佳实践
【6月更文挑战第25天】Java企业开发常用Hibernate和JPA,两者通过ORM简化数据库操作,提升开发效率。它们支持复杂查询,具有良好的可扩展性。最佳实践中,应注意映射配置的合理性,优化查询性能,利用缓存提升性能,以及妥善管理事务。示例代码展示了使用JPA进行分页查询的方法。
35 0
|
5月前
|
Java 数据库连接 数据库
hibernate多对多、正向工程创建数据表——访问温馨提示
hibernate多对多、正向工程创建数据表——访问温馨提示
|
SQL XML 存储
Hibernate框架【五】——基本映射——多对多映射
Hibernate框架【五】——基本映射——多对多映射
175 0
|
5月前
|
机器学习/深度学习 SQL Java
Hibernate - 多对多关联关系映射
Hibernate - 多对多关联关系映射
56 0
|
Java 数据库连接 数据库
hibernate多对多、正向工程创建数据表——访问温馨提示
hibernate多对多、正向工程创建数据表——访问温馨提示
|
XML Java 数据库连接
《Hibernate上课笔记》-----class7----Hibernate实现多对多关联映射
《Hibernate上课笔记》-----class7----Hibernate实现多对多关联映射
87 0
《Hibernate上课笔记》-----class7----Hibernate实现多对多关联映射