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. 网易回合制游戏录像批量下载(失效 不是因为代码 是因为网易官方关闭了录像网站 :P)

    最近在访问网易大话西游2的录像专区时,发现页面还是很早之前的板式,网易的编辑并没有打算重新美化的打算,不由得内心一寒,结合之前好几个回合制游戏的倒闭,让很多人回顾都没办法回顾, 而且,很多人现在也没有 ...

  2. 使用CKRule实现促销管理系统

    1, 常见的促销模型 促销管理系统在很多地方都有使用,大家去超市就经常体现到,感受到,不少中小型单位都其促销活动,要搞促销活动最好是有应用软件支持,这样就比较灵活管理也方便.而依靠手工处理的话效率会比 ...

  3. 【读书笔记】如何高效学习(Learn More ,Study Less)

    导读: 你会不会好奇为什么学习好的人会学的越来越好?那些课下不学习的人却比你考的好?一个人是怎么同时拿到好几个学位?为啥反复背的知识要领总是忘?为啥看个书总是不停走神?为啥总是苦逼似得看书直至厌烦? ...

  4. ViewPager+fragment的使用

    如图我在一个继承FragmentActivity的类中嵌套了3个fragment分别能实现3个不同的界面,默认展现第一个,在第一个的fragment中有个ViewPager在ViewPager中嵌套了 ...

  5. 如何设置树莓派的VNC开机时启动

    转载:http://www.linuxidc.com/Linux/2016-12/138793.htm 下面正式开始配置 首先 sudo nano /etc/init.d/vncserver 然后 复 ...

  6. python入门17 类和对象

    类:一类事物的抽象化.概念: 类的变量(属于类的变量,定义在类的开始处)  成员变量(self.变量) 类的方法( @classmethod,cls参数)   成员方法( self参数 )  静态方法 ...

  7. Android进阶笔记09:Android 万能适配器

    1. Android 万能适配器      项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter.用起来虽然还不错,但每次都 ...

  8. { ($0, Resolver($0.box)) }(Promise<T>(.pending)):闭包的定义与执行合一

    public class func pending() -> (promise: Promise<T>, resolver: Resolver<T>) { return ...

  9. 布局方式-inline-block布局

    .像文本一样排block元素 .没有清除浮动等问题 .需要处理间隙     一种方式 <style> .container{ width: 800px; height: 200px; fo ...

  10. 2018.11.30 zsh: command not found: mysql 的解决办法mac环境下

    系统环境变量的问题.解决办法: 1.打开终端.输入open .zshrc 会出现一个可编辑文档, 2.找到# User configuration部分,在下一行添加source ~/.bash_pro ...