一对一关联

假设有两个持久化类(实体类)User与Address,它们之间存在一对一的关系

1,通过主键关联(个人偏向另外一种)

User.hbm.xml文件配置
<id name="userid" type="java.lang.Integer">
<column name="userid" />
<!-- 主键关联,将主键生成策略改为foreign,表明由关联类来生成主键,
即直接使用另外关联类的主键值,该实体类不能生成主键 -->
<generator class="foreign" />
<para name="property">address</para><!-- -->
</id>
<property name="name" type="java.lang.String">
<column name="name" length="12" />
</property>
<property name="password" type="java.lang.String">
<column name="password" length="16" />
</property>
<one-to-one name="address" class="Address" constrained="true"></one-to-one></span>

  Addrss.hbm.xml文件配置

<id name="addressid" type="java.lang.Integer">
<column name="addressid" />
<generator class="identity" />
</id>
<property name="addressinfo" type="java.lang.String">
<column name="addressinfo" length="12" />
</property>

  

2通过外键关联

两张表主键不同,通过给一张表添加外键列来保持一对一关系,所以在user 表中加入address_id
直接在原始的User配置文件加入下行代码
 <!-- class属性:另外个实体类,将其的address属性映射为address表的外键address_id,
unique指定一对一映射
-->
<many-to-one name="address" class="Address" unique="true">
<!-- 外键 -->
<column name="address_id"></column>
</many-to-one>

  

一对多关联映射

还是上方例子为例,一个用户拥有多个地址
第一步:在一的一方表示出多(即在用户中表示多)
在User.java表示多,生成get,set方法
private Set<Address> setAddress = new HashSet<Address>();  

    public Set<Address> getSetAddress() {
return setAddress;
}
public void setSetAddress(Set<Address> setAddress) {
this.setAddress = setAddress;
}

  第二步:在Address.java表示一

  

private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}

  

第三步:配置Uesr.hbm.xml与Address.hbm.xml的基本映射
 
第四步:在一的配置文件(User.hbm.xml)配置多的一方
 <!--set集合名称 -->
<!--hibernate机制,双向维护外键 columen 外键名称-->
<key column="user_address"></key>
<one-to-many class="Address全路径"/>
</set>

  第五步:在多的配置文件(Address.hbm.xml)配置一的一方

<!--name属性 写address.java表示的user-->
<many-to-one name="user" class="User全路径" column="外键名"></many-to-one>

  

多对多的关联映射

多对多一般创建第三张中间表来维护两个表之间关系
场景:公司里面一个用户有多个角色,一个角色就多个用户
 
第一步:创建实体类对象(user  ,role)
第二步:在user.java表示role和在role.java表示user
user.java表示role
private Set<Role> setRole = new HashSet<Role>();
public Set<Role> getSetRole() {
return setRole;
}
public void setSetRole(Set<Role> setRole) {
this.setRole = setRole;
}

  role.java表示user

private Set<User> setUser = new HashSet<User>();  

    public Set<User> getSetUser() {
return setUser;
}
public void setSetUser(Set<User> setUser) {
this.setUser = setUser;
}

  

第三步:配置两个类的基本映射
第四步:分别在配置文件中配置
user配置role
<!--
name 角色set集合名称
table 第三张表的名称
-->
<set name="setRole" table="t_ub">
<!-- 配置当前映射文件在第三张表外键名称 -->
<key column="uid"></key>
<many-to-many class="路径" column="rid"></many-to-many>
</set>

  role配置user

 <!--
name 角色set集合名称
table 第三张表的名称
-->
<set name="setUser" table="t_ub">
<!-- 配置当前映射文件在第三张表外键名称 -->
<key column="bid"></key>
<many-to-many class="路径" column="uid"></many-to-many>
</set>

  

由于t_user表与t_role没有外键关联,可以直接进行crud操作,两表的关系通过第三张表来维护(后面会写第三张表的维护)

Hibernate学习笔记(3)---hibernate关联关系映射的更多相关文章

  1. hibernate学习笔记之四 Hibernate的增删改查

    采用JUnit测试,继承TestCase import java.util.Date; import junit.framework.TestCase; import org.hibernate.Se ...

  2. Hibernate学习笔记(六) — Hibernate的二级缓存

    我们知道hibernate的一级缓存是将数据缓存到了session中从而降低与数据库的交互.那么二级缓存呢? 一.应用场合 比方.在12306购票时.须要选择出发地与目的地,假设每点一次都与数据库交互 ...

  3. Hibernate学习笔记二:常用映射配置

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6760895.html 一:单向一对一 常用唯一外键的方法来配置单向一对一关系. 1:实体关系 类A中有类B对象 ...

  4. hibernate学习笔记之一 hibernate简介

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架 hibernate可以自动生成SQL语句,自 ...

  5. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

  6. Hibernate学习笔记(一)

    2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...

  7. Hibernate 学习笔记一

    Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...

  8. Hibernate学习笔记-Hibernate HQL查询

    Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...

  9. JPA学习笔记(8)——映射一对多关联关系

    一对多关联关系 本文有很多和多对一是一样的,因此不会写得非常具体. 有看不懂的.能够參考JPA学习笔记(7)--映射多对一关联关系 Order实体类 package com.jpa.helloworl ...

  10. Hibernate学习一:Hibernate注解CascadeType

    http://zy19982004.iteye.com/blog/1721846 ———————————————————————————————————————————————————————— Hi ...

随机推荐

  1. 从setTimeout看js函数执行

    老实说,写这篇文章的时候心里是有点压抑的,因为受到打击了,为什么?就 因为喜欢折腾不小心看到了这个"简单"的函数:        for (var i = 0; i < 5; ...

  2. MySQL 索引管理与执行计划

    1.1 索引的介绍 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息.如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息. ...

  3. 发红包android

    立即春节,写个应景的控件         思路分析 1.红包沿着不同的轨迹由上往下运动 2.当手指捕获到一个红包,红包停止原先的运动,能够随着手指的滑动做跟手操作 3.当手指动作停止后,红包放大 4. ...

  4. 用node.js实现mvc相册资源管理器

    摘要:通过前两天的学习我大概学了了,用formidable模块文件上传,express框架,以及利用fs模块进行文件读取,今天我学习了如何用这些知识来制作相册,暂没有数据库,所以做的也是本地的资源管理 ...

  5. 用vue做app内嵌页遇到的坑

    公司要求用vue做一个微信端的网站,其中还包含一些app的内嵌页.开始的时候没想那么多,就直接用vue-cli搭了一个单页的vue项目,可随着项目越做越大,页面越来越多,问题就开始暴露出来了. 众所周 ...

  6. 机器学习笔记2 – sklearn之iris数据集

    前言 本篇我会使用scikit-learn这个开源机器学习库来对iris数据集进行分类练习. 我将分别使用两种不同的scikit-learn内置算法--Decision Tree(决策树)和kNN(邻 ...

  7. 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载

    <深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位 ...

  8. 关于《Head First Python》一书中print_lol()函数的思考

    关于<Head First Python>一书中print_lol()函数的思考 在<Head First Python>第一章中,讲述到Python处理复杂数据(以电影数据列 ...

  9. HTML5 进阶系列:拖放 API 实现拖放排序(转载)

    HTML5之拖放API实现拖放排序 前言 HTML5 中提供了直接拖放的 API,极大的方便我们实现拖放效果,不需要去写一大堆的 js,只需要通过监听元素的拖放事件就能实现各种拖放功能. 想要拖放某个 ...

  10. Python学习日记:day9--------函数

    初识函数 1,自定义函数 s ='内容' #自定义函数 def my_len():#自定义函数没有参数 i =0 for k in s: i+=1 print(i) return i #返回值 my_ ...