zoukankan      html  css  js  c++  java
  • hibernate多对一、一对一、一对多、多对多的配置方法

    hihernate一对多关联映射(单向Classes----->Student)

    一对多关联映射利用了多对一关联映射原理

    多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一
    一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多

    也就是说一对多和多对一的映射策略是一样的,只是站的角度不同

    在一一端维护关系的缺点:
    * 如果将t_student表里的classesid字段设置为非空,则无法保存
    * 因为不是在student这一端维护关系,所以student不知道是哪个班的,
    所以需要发出多余的update语句来更新关系

    hihernate一对多关联映射(双向Classes<----->Student)

    一对多双向关联映射:
    * 在一一端的集合上使用<key>,在对方表中加入一个外键指向一一端
    * 在多一端采用<many-to-one>

    注意:<key>标签指定的外键字段必须和<many-to-one>指定的外键字段一致,否则引用字段的错误

    如果在”一“一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多
    的一端来维护关联关系

    关于inverse属性:
    inverse主要用在一对多和多对多双向关联上,inverse可以被设置到集合标签<set>上,
    默认inverse为false,所以我们可以从”一“一端和”多“一端维护关联关系,
    如果设置成inverse为true,则我们只能从多一端来维护关联关系

    注意:inverse属性,只影响数据的存储,也就是持久化

    inverse和cascade
    * inverse是关联关系的控制方向
    * cascade操作上的连锁反应

    hibernate一对一主键关联映射(单向关联Person---->IdCard)

    一对一主键关联映射:让两个实体对象的id保持相同,这样可以避免多余的字段被创建

    具体映射:

    <id name="id">
    <!-- person的主键来源idCard,也就是共享idCard的主键 -->
    <generator class="foreign">
    <param name="property">idCard</param>
    </generator>
    </id>
    <property name="name"/>
    <!-- one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载,
    constrained="true", 表明当前主键上存在一个约束,person的主键作为外键参照了idCard 
    -->
    <one-to-one name="idCard" constrained="true"/>

    hibernate一对一主键关联映射(双向关联Person<---->IdCard)

    需要在idcard映射文件中加入<one-to-one>标签指向person,指示hibernate如何加载person
    默认根据主键加载

    hibernate一对一唯一外键关联映射(单向关联Person---->IdCard)

    一对唯一外键关联映射是多对一关联映射的特例

    可以采用<many-to-one>标签,指定多的一端的unique=true,这样就限制了多的一端的多重性为一
    通过这种手段映射一对一唯一外键关联

    hibernate一对一唯一外键关联映射(双向关联Person<---->IdCard)

    一对一唯一外键关联双向,需要在另一端(idcard),添加<one-to-one>标签,指示hibernate如何加载
    其关联对象,默认根据主键加载person,外键关联映射中,因为两个实体采用的是person的外键维护的关系,
    所以不能指定主键加载person,而要根据person的外键加载,所以采用如下映射方式:
    <one-to-one name="person" property-ref="idCard"/>

    hibernate多对一关联映射

    关联映射的本质:
    * 将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用

    <many-to-one>会在多的一端加入一个外键,指向一的一端,这个外键是由<many-to-one>
    中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致

    <many-to-one>标签的定义示例:
    * <many-to-one name="group" column="groupid"/>

    理解级联的含义?
    * 是对象的连锁操作 

    hibernate多对多关联映射(单向User---->Role)

    具体映射方式:
    <set name="roles" table="t_user_role">
    <key column="userid"/>
    <many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/>
    </set>

    hibernate多对多关联映射(双向User<---->Role)

    映射方法:
    <set name="roles" table="t_user_role">
    <key column="userid"/>
    <many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/>
    </set>
    table属性值必须和单向关联中的table属性值一致
    <key>中column属性值要与单向关联中的<many-to-many>标签中的column属性值一致
    在<many-to-many>中的column属性值要与单向关联中<key>标签的column属性值一致

    转自 -- http://hi.baidu.com/leslytt/item/c02ca049b32a28066cc2f022

  • 相关阅读:
    How to convert VirtualBox vdi to KVM qcow2
    (OK)(OK) adb -s emulator-5554 shell
    (OK)(OK) using adb with a NAT'ed VM
    (OK) How to access a NAT guest from host with VirtualBox
    (OK) Creating manually one VMs from an existing VDI file in CLI (VBoxManage) in Fedora 23
    (OK)(OK) Creating VMs from an existing VDI file in CLI (VBoxManage) in Fedora 23
    (OK) Creating_VMs_from_an_existing_VDI_file.txt
    (OK) Creating VMs from an existing VDI file —— in OS X
    (OK) install_IBM_SERVER.txt
    (OK) install chrome & busybox in android-x86_64 —— uninstall chrome
  • 原文地址:https://www.cnblogs.com/auto714/p/2915520.html
Copyright © 2011-2022 走看看