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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem91dG9uZ3l1YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">



多对多 在 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 优化 有关 操作。

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

hibernate 多对多 最佳实践的更多相关文章

  1. Struts2、Spring、Hibernate 高效开发的最佳实践(转载)

    Struts2.Spring.Hibernate 高效开发的最佳实践 Struts2.Spring.Hibernate(SSH)是最常用的 Java EE Web 组件层的开发技术搭配,网络中和许多 ...

  2. atitit. 统计功能框架的最佳实践(1)---- on hibernate criteria

    atitit. 统计功能框架的最佳实践(1)---- on hibernate criteria 1. 关键字 1 2. 统计功能框架普通有有些条件选项...一个日期选项..一个日期类型(日,周,月份 ...

  3. MySQL 性能优化 30个数据库设计的最佳实践

    数据库设计是整个程序的重点之一,为了支持相关程序运行,最佳的数据库设计往往不可能一蹴而就,只能反复探寻并逐步求精,这是一个复杂的过程,也是规划和结构化数据库中的数据对象以及这些数据对象之间关系的过程. ...

  4. java 读取文件最佳实践

    1.  前言 Java应用中很常见的一个问题,如何读取jar/war包内和所在路径的配置文件,不同的人根据不同的实践总结出了不同的方案,但其他人应用却会因为环境等的差异发现各种问题,本文则从原理上解释 ...

  5. 转载--JAVA读取文件最佳实践

    1.  前言 Java应用中很常见的一个问题,如何读取jar/war包内和所在路径的配置文件,不同的人根据不同的实践总结出了不同的方案,但其他人应用却会因为环境等的差异发现各种问题,本文则从原理上解释 ...

  6. JSR 303 - Bean Validation 介绍及最佳实践

    JSR 303 - Bean Validation 介绍及最佳实践 JSR 303 – Bean Validation 是一个数据验证的规范,2009 年 11 月确定最终方案.2009 年 12 月 ...

  7. atitit.hbnt orm db 新新增更新最佳实践o99

    atitit.hbnt orm db 新新增更新最佳实践o99 1. merge跟个save了. 1 2. POJO对象处于游离态.持久态.托管态.使用merge()的情况. 1 3. @Dynami ...

  8. atitit. 日志系统的原则and设计and最佳实践(1)-----原理理论总结.

    atitit. 日志系统的原则and设计and最佳实践总结. 1. 日志系统是一种不可或缺的单元测试,跟踪调试工具 1 2. 日志系统框架通常应当包括如下基本特性 1 1. 所输出的日志拥有自己的分类 ...

  9. atitit.hbnt orm db 新新增更新最佳实践o7

    atitit.hbnt orm db 新新增更新最佳实践o7 1. merge跟个save了. 1 2. POJO对象处于游离态.持久态.托管态.使用merge()的情况. 1 3. @Dynamic ...

随机推荐

  1. bash,bg,bind,break,builtin,caller,compgen, complete,compopt,continue,declare,dirs,disown,enable,eval,exec,expo

    bash,bg,bind,break,builtin,caller,compgen, complete,compopt,continue,declare,dirs,disown,enable,eval ...

  2. leetcode第一刷_Convert Sorted List to Binary Search Tree

    好,二叉搜索树粉末登场,有关他的问题有这么几个,给你一个n,如何求全部的n个节点的二叉搜索树个数?能不能把全部的这些二叉搜索树打印出来? 这道题倒不用考虑这么多,直接转即可了,我用的思想是分治,每次找 ...

  3. crashRpt用法

    从官网上下载crashRpt的源代码,按说明编译出对应的lib和dll 1 在编译crashRpt的时候,在环境变量中设置  crashrptDir=D:\work\AIW\WebMicaps\Web ...

  4. hdu 4857 逃生 拓扑排序+PQ,剥层分析

    pid=4857">hdu4857 逃生 题目是求拓扑排序,但不是依照字典序最小输出,而是要使较小的数排在最前面. 一開始的错误思路:给每一个点确定一个优先级(该点所能到达的最小的点) ...

  5. POJ 2240 Arbitrage(最短路 套汇)

    题意  给你n种币种之间的汇率关系  推断是否能形成套汇现象  即某币种多次换为其他币种再换回来结果比原来多 基础的最短路  仅仅是加号换为了乘号 #include<cstdio> #in ...

  6. 优化数据页面(18)——标注keyword

    优化数据页面(18)--标注keyword 设计要点:优化数据页面.界面设计.美化exce 秀秀:事实上俺认为,相同是数据项,它们的重要程度也不同. 阿金:嗯? 秀秀:每一行数据时描写叙述一条信息的, ...

  7. Quartz.NET学习系列

    Quartz.NET它是一个开源的任务调度引擎,对于周期性任务,持久性任务提供了很好的支持,并且支持持久性.集群等功能. 这是什么对我来说Quartz.NET学习记录: 源代码下载http://yun ...

  8. Java面试题集(136-150)

    摘要:目,尽管仅仅有15道题目.可是包括的信息量还是非常大的,非常多题目背后的解题思路和算法是非常值得玩味的. 136.给出以下的二叉树先序.中序.后序遍历的序列? 答:先序序列:ABDEGHCF.中 ...

  9. SlopOne推荐算法

    在开源框架taste中有SlopOne的Java实现,效果不错.使用movielens的数据,代码例如以下 代码 #coding:utf-8 import re import math #读取数据,并 ...

  10. 采用PopupWin控制消息推送功能

    最近的项目需要,急需实现消息推送功能.接连试了很多办法,让我们用JavaScript为了实现啊,其效果是不咋好,最后,我发现了一个PopupWin这个,看着眼前的成绩不错,开始使用. 1.准备工作.先 ...