一、一多关系

例如用户(Tb_User)和订单(Tb_Order)之间,一个用户对应了多个订单,多个订单对应一个用户。

除了基本的配置外,需要在用户类(单方)中添加订单的集合同样需要get/set方法,

private Set<Tb_Order> orders = new HashSet<Tb_Order>();

映射文件中添加关于订单的集合配置 one-to-many, <set>中name属性是设置类中关联集合的名称,table属性设置对应的表名,cascade设置增删改的级联操作

<set name="orders" table="TB_ORDER" cascade="all" inverse="true">
<key column="userid"></key>
<one-to-many class="com.lzq.model.Tb_Order" />
</set>

在订单中需要添加一个外键关联的类

private Tb_User user;

映射文件中添加关于用户类配置 one-to-many

<!-- 配置多对一 关系 -->
<many-to-one name="user" class="com.lzq.model.Tb_User" column="userid"></many-to-one>

1.查询,我们只需要查询任何一方,根据Get方法,在需要时可以自动去查询另外的一方。

下面的输出结果可以看见打印了user的查询语句和user的名字,再打印了order的查询语句和订单数量

  /**
* 查找
*/
@Test
public void get() {
Tb_User u = session.get(Tb_User.class, "8cd98f5e-7b7e-46ae-96b5-591f7f2de6b4");
// 查询 Tb_User 不查询 Tb_Order
System.out.println(u.getName());
// 需要时,才会查询Tb_Order
System.out.println(u.getOrders().size());
} @Test
public void get_Order() {
Tb_Order u = session.get(Tb_Order.class, "6b545b76-539c-4010-b1be-15bfead6268c");
// 查询 Tb_Order 不查询Tb_User
System.out.println(u.getName());
// 需要时,才会查询Tb_User
System.out.println(u.getUser().getName());
}

2.保存

可以看见,代码中只保存了user并没有保存order,但是order是保存进去了的,因为在前面的映射配置文件中 cascade="all" 表示增删改都需要级联操作,若不写cascade属性,则需要保存了user后,手动的保存order,删除同理;

在一对多的关联设置中,若不想设置user,则需要将前面的映射配置文件 inverse属性改为false,否则更新到数据库中的userid为空。

  @Test
public void add() { Tb_User u = new Tb_User(HelpUtil.getUUID(), "王五", 1, new Date()); Tb_Order o1 = new Tb_Order(HelpUtil.getUUID(), 698.36, 28, new Date(), "1号订单");
Tb_Order o2 = new Tb_Order(HelpUtil.getUUID(), 46872.69, 99, new Date(), "2号订单");
// 多对一的关联设置
u.getOrders().add(o1);
u.getOrders().add(o2);
// 一对多的关联设置
o1.setUser(u);
o2.setUser(u); session.save(u); }

二、多多关系

在多多关系中,如果对中间表没有特殊的操作,则不需要在代码中实现中间表的实体类和映射文件。

只需要在两个类中加上一个另一个类的集合,在映射文件中配置many-to-many

例如用户Tb_User和角色Tb_Role

在用户表中添加集合,并要有get/set方法

private Set<Tb_Role> roles = new HashSet<Tb_Role>();

在映射文件中加入多多关系映射,这里的table是多多关系产生的关联表,key是当前类对应关联表中的外键字段,在many-to-many中的class指另一个关联的类,column指另一个类值关联表中的外键

<set name="roles" table="TB_USERROLE" cascade="all" inverse="false">
<key column="USERID"></key>
<many-to-many class="com.lzq.model.Tb_Role" column="ROLEID" />
</set>

在Role的映射文件中

<set name="users" table="TB_USERROLE" inverse="true" cascade="all">
<key column="ROLEID"></key>
<many-to-many class="com.lzq.model.Tb_User" column="USERID" />
</set>

这里注意下inverse这个属性,我的理解是设置控制方反转,由哪一方来维护数据的统一性,在user配置中,inverse设置为false,意思是维护数据(在这里维护数据就是指在中间表TB_UerRole中插入数据)的操作不用反转,user自己来,在Role中inverse设置为false,就是维护数据让User来,role自己不来做。那么此时,更新了user表时若role有变动,则会去更新中间表,但是若role表中的user有变动,是不会影响其他表的。

最后附上我做测试的demo:http://pan.baidu.com/s/1sl06Hrv

Hibernate学习笔记--------2.一多|多多的CRUD的更多相关文章

  1. Hibernate学习笔记(一)

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

  2. Hibernate 学习笔记一

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

  3. Hibernate学习笔记(二)

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

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

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

  5. MongoDB学习笔记:文档Crud Shell

    MongoDB学习笔记:文档Crud Shell   文档插入 一.插入语法 db.collection.insertOne() 将单个文档插入到集合中.db.collection.insertMan ...

  6. Hibernate学习笔记

    一.Hibernate基础 1.Hibernate简介 Hibernate是一种对象关系映射(ORM)框架,是实现持久化存储的一种解决方案.Java包括Java类到数据库表的映射和数据查询及获取的方法 ...

  7. 【Hibernate学习笔记-3】在Spring下整合Hibernate时, 关于sessionFactory的类型的说明

    摘要 在Spring下整合Hibernate时,关于sessionFactory的配置方式主要有两种,分别为注解配置方式,和xml配置方式,下面将对这两种配置方式进行介绍. 1. sessionFac ...

  8. Hibernate学习笔记(四)

    我是从b站视频上学习的hibernate框架,其中有很多和当前版本不符合之处,我在笔记中进行了修改以下是b站视频地址:https://www.bilibili.com/video/av14626440 ...

  9. Hibernate学习笔记(三)

    我是从b站视频上学习的hibernate框架,其中有很多和当前版本不符合之处,我在笔记中进行了修改以下是b站视频地址:https://www.bilibili.com/video/av14626440 ...

随机推荐

  1. Webdriver API (二)

    (转载) 1.3 打开测试页面 对页面对测试,首先要打开被测试页面的地址(如:http://www.google.com),web driver 提供的get方法可以打开一个页面: // And no ...

  2. PLSQL Develop 配置

    plsq 连接oracle数据库的配置步骤: 1.下载oracle客户端: 下载地址:http://www.oracle.com/technetwork/topics/winx64soft-08954 ...

  3. Android UI -- 布局介绍(布局包括FrameLayout, LinearLayout, RelativeLayout, GridLayout)

    首先介绍常用布局类 FrameLayout 最简单的布局管理器. 这个布局管理类有几个特性: 添加组件默认在左上角的. 如果添加多个组件会叠加到一起,并且都在左上角.(可以通过一gravity属性改变 ...

  4. temorrow read

    http://blog.csdn.net/yimiyangguang1314/article/details/6268177 http://www.cnblogs.com/killmyday/arch ...

  5. 【原创】tcp协议那块一些点(想到了再加)

    1.3次握手 4次握手 2.那张状态图,FIN_WAIT主动关闭方,CLOSE_WAIT被动关闭方 主动关闭方发出FIN后进入FIN_WAIT,FIN_WAIT方收到了ACK和FIN,发出了ACK,则 ...

  6. 如何写出性能好的sql

    开发人员是很少注意SQL对数据库性能影响的重要性的,大多程序员都会认为SQL是比较简单的,需要的时候查查手册就可以了,很少有深究的. 这样的观念对大型系统的开发是致命的,需要纠正这样的观念. 造成这样 ...

  7. Delphi给窗体镶边-为控件加边框,描边,改变边框颜色

    PS:因为我现在用的电脑是WIN7 64位系统,所以没有实现功能,不知道XP是否可行. //1.定义方法 procedure WMNCPaint(var Msg : TWMNCPaint); mess ...

  8. nyoj 236 心急的C小加

    心急的C小加 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的 ...

  9. .NET通用基本权限系统

    DEMO下载地址: http://download.csdn.net/detail/shecixiong/5372895 一.开发技术:B/S(.NET C# ) 1.Windows XP以上 (支援 ...

  10. Winform- DotNetBar for Windows Forms的安装的添加

    Winform界面不好看,偶尔在网上看到winform的界面美化,对比了一下选择了DotNetBar for Windows Forms 1.破解版网上很多,提供一个参考的下载地址http://dx. ...