1.  数据库中的表关系

一对一、一对多(多对一)、多对一

2.  如何确立表中的表关系

一对多的关系如何实现:使用外键约束,一的方称为主表,多的方称为从表。

外键:从表中有一列,该列的取值除了null之外,只能来源于主表的主键,默认情况下,外键字段的值是可以重复的

多对多的表关系如何实现?

使用中间表,中间表只能有两个外键,引用两个多对多表的主键,不能有其他字段信息,中间表的主键采用联合主键

如果任何一个多方的表和中间表比较,都是一对多的关系。

一对一的表关系在数据库中如何实现?两种

1.建立外键的方式:

使用外键约束、唯一约束、非空约束,他是把外键约束加了唯一约束和非空约束,从而实现一对一。

2.使用主键的方式:

让其中一张表既是主键,又是外键

如何确定两张表之间的关系:找外键

3.  多表映射遵循的步骤

第一步:确立两张表之间的关系

第二步:在数据库中实现多对多的表关系的建立

第三步:在实体类中描述出两个实体类之间的关系

第四步:在映射配置中建立两张表和两个实体之间的关系

4.  一对多关系映射配置及其操作

实例:客户和联系人两张表

第一步:确立两张表之间的关系

  一个客户可以包含多个联系人,多个联系人可以属于同一个客户,所以客户和联系人是多对多的关系

第二步:在数据库中实现多对多的表关系的建立

  实现一对多的关系靠的是外键,客户是主表,联系人是从表,需要在联系人表中添加外键

第三步:在实体类中描述出两个实体类之间的关系

  主表的实体类包含从表实体类的集合引用

<!-- 一对多主表实体的配置

        标签

           Set

           用于配置set集合属性

           属性:

           name:指定实体类中set集合的属性名称

           table:指定从表的名称,在一对多配置时候,可以不写

           key

           作用:用于映射外键字段

           属性:

           column:指定外键字段名称

           one-to-many:

           作用:用于建立一对多的映射配置

           属性:

           class:用于指定从表实体的名称

        -->

        <set name="linkmans" table="cust_linkman">

            <key column="lkm_cust_id" ></key>

            <one-to-many class="LinkMan"></one-to-many>

        </set>

  从表的实体类应该包含主表实体类的对象引用

<?xml version="1.0" encoding="UTF-8"?>

<!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.wbs.domain">

        <class name="LinkMan" table="cust_linkman">

        <id name="lkmId" column="lkm_id">

            <generator class="native"></generator>

        </id>

        <property name="lkmName" column="cust_lkmName"></property>

        <property name="lkmGender"  column="cust_lkmGender"></property>

        <property name="lkmPhone" column="cust_lkmPhone"></property>

        <property name="lkmMobile" column="cust_lkmMobile"></property>

        <property name="lkmEmail" column="cust_lkmEmail"></property>

        <property name="lkmPosition" column="cust_lkmPosition"></property>

        <property name="lkmMemo" column="cust_lkmMemo"></property>

        <!-- 一对多关系映射:从表实体的映射配置 -->

        <!-- many-to-one建立一对多的映射配置

        属性:

        name 从表实体中引用实体对象引用的名称

        class 指定这个属性对应的实体类名称

        column 指定从表中外键字段的名称

         -->

        <many-to-one name="customer" class="Customer" column="lkm_cust_id"></many-to-one>

        </class>

第四步:在映射配置中建立两张表和两个实体之间的关系

字符在数据库中用char或者varchar,但是在实体类中用String或者Criteria

  1. 1.  多对多关系映射配置及其操作
    1. 1.  确定两张表之间的关系

一个用户可以有多个角色

一个角色可以赋给多个角色

所以用于和角色之间是多对多

  1. 2.  数据库中两张表之间的关系建立

在数据库中实现多对多要靠中间表

中间表只能出现用户和角色的主键

  1. 3.  在实体类中描述出两个实体类之间的关系

各自包含对方一个集合引用

下边是多对多关系中的一个映射配置文件中的一部分

<!--

        set

        用于映射集合属性

            属性:

            name:用于指定集合名称

            table:指的是中间表的名称(多对多的表中间一定要写)

        key:用于映射外键字段

            key中的属性column指的是当前实体在中间表的外键字段名称

        many-to-many:用于映射多对多关系

            属性:

            column:对方在中间表中的外键字段名称

            class:对方的实体类名称

         -->

        <set name="roles" table="user_role_ref">

            <key column="user_id"></key>

            <many-to-many class="SysRole" column="role_id"></many-to-many>

    </set>

上边是数据库里面创建联合主键的方式

  1. 2.  进行多对多之间的保存操作

需要在任何一个set配置inverse=true,让某个实体类放弃维护关系,才可以正常的执行保存功能。

public class HibernateDemo1 {

    /**

     * 保存操作;

     * 创建两个用户和三个角色

     * 让1号用户具备具备1号和2号角色

     * 让2号用户具备具备3号和2号角色

     * 保存用户和角色

     */

    @Test

    public void test1(){

       SysUser u1=new SysUser();

       u1.setUserName("用户1");

       SysUser u2=new SysUser();

       u1.setUserName("用户2");

       SysRole r1=new SysRole();

       r1.setRoleName("角色1");

       SysRole r2=new SysRole();

       r1.setRoleName("角色2");

       SysRole r3=new SysRole();

       r1.setRoleName("角色3");

       //建立双向关联关系

       u1.getRoles().add(r1);

       u1.getRoles().add(r2);

       u2.getRoles().add(r2);

       u2.getRoles().add(r3);

       //再建立角色

       r1.getUsers().add(u1);

       r2.getUsers().add(u1);

       r2.getUsers().add(u2);

       r3.getUsers().add(u2);

       Session s=HibernateUtils.getCurrentSession();

       Transaction tx=s.beginTransaction();

       s.save(r3);

       s.save(r2);

       s.save(r1);

       s.save(u1);

       s.save(u2);

       tx.commit();

    }
  1. 删除操作(实际开发禁止使用)

但是需要级联删除的时候需要配置级联的任一个配置文件的inverse=true,需要在两个多对多的实体类的配置文件中写出cascade=delete,不然不会级联删除

<set name="users" table="user_role_ref" inverse="true" cascade="delete">

            <key column="role_id"></key>

            <many-to-many class="SysUser" column="user_id"></many-to-many>

    </set>
 /**

     * 删除操作

     * 实际开发中多对多的双向级联删除是禁止的

     */

    @Test

    public void test2(){

       Session s=HibernateUtils.getCurrentSession();

       Transaction tx=s.beginTransaction();

       //查询ID为103的用户

       SysUser u=s.get(SysUser.class, 115L);

       System.out.println(u);

       s.delete(u);

       tx.commit();

}

hibernate笔记1的更多相关文章

  1. 框架Hibernate笔记系列 基础Session

    标题:框架Hibernate笔记 资料地址: 1. www.icoolxue.com 孔浩 1.背景简介 Hibenate是JBoss公司的产品.它是数据持久化的框架.Usually,我们使用JDBC ...

  2. hibernate笔记--cascade级联以及inverse属性

    cascade : 不管是单向多对一还是一对多,或者是双向的一对多关系,在一的一端映射文件中有一个set标签,在多的一端有many-to-one标签,拿前几篇笔记里讲的Grade和Student举例, ...

  3. Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询

    在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题? 解决方案一,按照Object[]数据取出数据,然后自己组bean 解决方 ...

  4. Hibernate笔记一

    背景 jdbc的优缺点 A:直接操作底层,提供了简单,便捷的访问数据库方法,跨平台比较强,灵活,可以写很多赋值的SQL语句:是最底层的数据库操作,所以效率比较高,Sql语句可以自己选择写,采用效率最高 ...

  5. hibernate笔记--缓存机制之 二级缓存(sessionFactory)和查询缓存

    二级缓存(sessionFactory): Hibernate的二级缓存由SessionFactory对象管理,是应用级别的缓存.它可以缓存整个应用的持久化对象,所以又称为“SessionFactor ...

  6. hibernate笔记--缓存机制之 一级缓存(session缓存)

    一级缓存: 又称为session缓存,它和session生命周期相同,周期非常短.是事务级别的缓存: 还是以Book和Category这两个表为例,我们用代码观察一个缓存的存在: 假设现在我要去查询i ...

  7. hibernate笔记--使用注解(annotation)方式配置单(双)向多对一的映射关系

    前面几篇都是介绍的用配置文件来实现实体类到数据库表的映射,这种方式是比较麻烦的,每一个pojo类都需要写一个相应的*.hbm.xml,无疑增加了很多代码量,不过也有优点就是利于维护,为了方便开发,Hi ...

  8. hibernate笔记--继承映射关系的三种实现方式

    单表继承映射(一张表): 假设我们现在有三个类,关系如下: Person类有两个子类Student和Teacher,并且子类都具有自己独有的属性.这种实体关系在hibernate中可以使用单表的继承映 ...

  9. hibernate笔记--单(双)向的多对多映射关系

    在讲单向的多对多的映射关系的案例时,我们假设我们有两张表,一张角色表Role,一张权限表Function,我们知道一个角色或者说一个用户,可能有多个操作权限,而一种操作权限同时被多个用户所拥有,假如我 ...

  10. hibernate笔记--基于主键的单(双)向的一对一映射关系

    上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这 ...

随机推荐

  1. jQuery:mouseover and Increase the Size of an Image

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 【Linux】unix/Linux常用命令英文全称

    英文全称解释更容易理解 知其然,更要知其所以然 man: Manual 意思是手册,可以用这个命令查询其他命令的用法. pwd:Print working directory 显示当前工作路径. su ...

  3. git clone 指定的单个目录或文件夹

    git clone 指定的单个目录或文件夹 针对自己的项目 方法一 基于sparse clone变通方法 创建一个空仓库 拉取远程仓库信息 开启 sparse clone 设置过滤 更新仓库 创建空仓 ...

  4. 汽车后市场SWOT分析

    客户接待系统SWOT分析 版本  V0.1 所有人: 王超 S  客户接待系统符合市场的目前阶段需求.填补了市场的空白部分. W 市场推广的力度差异,市场由蓝海编成红海,多种厂商参与,创业团队不断进入 ...

  5. Rational ClearCase 系列

    Base + UCM 系列参考:http://blog.csdn.net/hhg208/article/details/5749050

  6. Tomcat无法正常启动start.bat 一闪而过、只显示USING 故障排除

    在云主机上配置tomcat的时候遇到的问题. 1. 开始的时候我将自己用的tomcat6绿色版打包放到了主机上,当我打开bin下面的时候startup.bat时,控制台一闪而过,查看log文件没有任何 ...

  7. JavaScript获取当前网页的源码

    通过 outerHTML document.documentElement.outerHTML 通过异步请求 $.get(window.location.href,function(res){ con ...

  8. NO.004-2018.02.09《离思五首·其四》唐代:元稹

    离思五首·其四_古诗文网 离思五首·其四 唐代:元稹 曾经沧海难为水,除却巫山不是云.曾经到临过沧海,别处的水就不足为顾:除了巫山,别处的云便不称其为云.曾经:曾经到临.经:经临,经过.难为:这里指“ ...

  9. Django聚合函数

    Django在Django .db中提供了以下聚合函数. 1.Avg:返回平均值 class Avg(expression, output_field=FloatField(), filter=Non ...

  10. oracle数据库中创建表空间和临时表空间,以及用户和密码以及设置密码永不过期

    首先进入oracle用户,命令是: su - oracle sqlplus /nolog connect system/123456@ora11g 或者 [oracle@localhost ~]$   ...