1. 什么是关联(association)
1.1 关联指的是类之间的引用关系。如果类A与类B关联,那么被引用的类B将被定义为类A的属性。例如:
public class A{
private B b = new B;
public A(){}
}
1.2 关联的分类:关联可以分为一对一、一对多/多对一、多对多关联
关联是有方向的

现在我们就讲的是一对多

把实体及配置文件导入

Order

/**
* hibernate关联关系
* 一对多:一个订单对应多个订单项
* 多对一:多个订单项对应一个订单(注:一个订单项对应一个订单)
* @author Administrator
*
*/
public class Order implements Serializable {
//订单id
private Integer orderId;
//订单编号
private String orderNO; //1.1 关联指的是类之间的引用关系。如果Order与类OrderItem关联,
//那么被引用的OrderItem将被定义为Order 的属性。例如:
private Set<OrderItem> orderitems=new HashSet<OrderItem>(); public Set<OrderItem> getOrderitems() {
return orderitems;
}
public void setOrderitems(Set<OrderItem> orderitems) {
this.orderitems = orderitems;
}
public Integer getOrderId() {
return orderId;
}
public void setOrderId(Integer orderId) {
this.orderId = orderId;
}
public String getOrderNO() {
return orderNO;
}
public void setOrderNO(String orderNO) {
this.orderNO = orderNO;
}
public Order() {
super();
}
@Override
public String toString() {
return "Order [orderId=" + orderId + ", orderNO=" + orderNO + ", orderitems=" + orderitems + "]";
} }

Order.hbm.xml

<?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>
<class name="com.hmc.hibernate02.entity.Order" table="t_order_hb">
<id name="orderId" type="java.lang.Integer" column="order_id">
<!--native:identity(标识列)+sequence(序列) -->
<generator class="native"></generator>
</id>
<property name="orderNO" type="java.lang.String" column="order_no"/>
<!--一方中的主键就是多方中的外键 -->
<!--
select o.*,oi.* from t_order_hb o inner join t_order_item_hb oi
on o.order_id=oi.oid
--> <!--建立关联关系 -->
<!--
name:实体类中定义的属性名,指向多方
cassade:用来控制如何操作关联的持久化对象的 -->
<set name="orderitems" cascade="save-update" inverse="true" table="t_order_item_hb" >
<!-- 指定连接的多方中的外键列 -->
<key column="oid"></key>
<!--指定实体之间的关联关系:一对多 -->
<!--class:指向的是多方的实体类的全路径名 -->
<one-to-many class="com.hmc.hibernate02.entity.OrderItem"/>
</set>
</class> </hibernate-mapping>

OrderItem

/**
* 多个订单项对应一个订单(注意:一个订单项唯一对应一个订单)
* @author Administrator
*
*/
public class OrderItem implements Serializable{
//订单项id
private Integer orderItemId;
//产品id
private Integer productId;
//数量
private Integer quantity;
//外键列
private Integer oid; //1.1 关联指的是类之间的引用关系。如果OrderItem与类Order关联,
//那么被引用的Order将被定义为OrderItem 的属性。例如:
private Order order; public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
public Integer getOrderItemId() {
return orderItemId;
}
public void setOrderItemId(Integer orderItemId) {
this.orderItemId = orderItemId;
}
public Integer getProductId() {
return productId;
}
public void setProductId(Integer productId) {
this.productId = productId;
}
public Integer getQuantity() {
return quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public Integer getOid() {
return oid;
}
public void setOid(Integer oid) {
this.oid = oid;
}
@Override
public String toString() {
return "OrderItem [orderItemId=" + orderItemId + ", productId=" + productId + ", quantity=" + quantity
+ ", oid=" + oid + "]";
}

OrderItem.hbm.xml

<?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>
<class name="com.hmc.hibernate02.entity.OrderItem" table="t_order_item_hb">
<id name="orderItemId" type="java.lang.Integer" column="order_item_id">
<!--native:identity(标识列)+sequence(序列) -->
<generator class="native"></generator>
</id>
<property name="productId" type="java.lang.Integer" column="product_id"/>
<property name="quantity" type="java.lang.Integer" column="quantity"/>
<property insert="false" update="false" name="oid" type="java.lang.Integer" column="oid"/>
<!--建立关联关系 -->
<!-- name:实体类中定义的属性名,指向一方 -->
<many-to-one name="order" cascade="save-update" class="com.hmc.hibernate02.entity.Order">
<!--多方的数据库表中的外键列,指向一方 -->
<column name="oid"></column>
</many-to-one> </class> </hibernate-mapping>

OrderDao

 public void add(Order order) {
Session session = SessionFactoryUtils.openSession();
Transaction transaction = session.beginTransaction();
session.save(order);
transaction.commit();
SessionFactoryUtils.closeSession();
} public Order get(Order order) {
Session session = SessionFactoryUtils.openSession();
Transaction transaction = session.beginTransaction();
Order o = session.get(Order.class, order.getOrderId());
//处理懒加载
if(null!=o) {
Hibernate.initialize(o.getOrderitems());
}
transaction.commit();
SessionFactoryUtils.closeSession();
return o;
} public void update(Order order){ Session session = SessionFactoryUtils.openSession();
Transaction transaction = session.beginTransaction();
//先查,再更新
Order o = session.get(Order.class, order.getOrderId());
if(null!=o) {
//拿到多方
Set<OrderItem> orderitems = o.getOrderitems(); OrderItem orderItem=null;
for (int i = 0; i <=2; i++) {
orderItem=new OrderItem();
orderItem.setProductId(i);
orderItem.setQuantity(i+2); //建立关联关系
orderItem.setOrder(o);
o.getOrderitems().add(orderItem);
}
session.update(o);
}
transaction.commit();
SessionFactoryUtils.closeSession(); } //级联删除
public void delete(Order order) {
Session Session = SessionFactoryUtils.openSession();
Transaction Transaction = Session.beginTransaction();
//先查询,在删除
Order o = Session.get(Order.class, order.getOrderId());
if(null!=o) { /**
* 解除关联关系:先删从表,再删主表
* 1)禁用联级删除
* 2)先删从表,再删主表
* 3)手动代码维护
*/
Set<OrderItem> orderitems = o.getOrderitems();
for (OrderItem orderItem : orderitems) {
Session.delete(orderItem);
}
Session.delete(o);
} Transaction.commit();
SessionFactoryUtils.closeSession();
}

测试类进行测试OrderDaoTest

Hibernate:
select
order0_.order_id as order_id1_0_0_,
order0_.order_no as order_no2_0_0_
from
t_order_hb order0_
where
order0_.order_id=?
Hibernate:
select
orderitems0_.oid as oid4_1_0_,
orderitems0_.order_item_id as order_it1_1_0_,
orderitems0_.order_item_id as order_it1_1_1_,
orderitems0_.product_id as product_2_1_1_,
orderitems0_.quantity as quantity3_1_1_,
orderitems0_.oid as oid4_1_1_
from
t_order_item_hb orderitems0_
where
orderitems0_.oid=?
Hibernate:
delete
from
t_order_item_hb
where
order_item_id=?
Hibernate:
delete
from
t_order_item_hb
where
order_item_id=?
Hibernate:
delete
from
t_order_item_hb
where
order_item_id=?
Hibernate:
delete
from
t_order_hb
where
order_id=?

hibernate之一对多关系的更多相关文章

  1. Hibernate的关联映射关系

    一:多对一 <many-to-one 1.name:当前类的属性名(关联映射的类) 2.column:属性多对应的类的对应的表的外键(连接条件) 3.class:属性所对应的类的权限定名 4.n ...

  2. Hibernate与Jpa的关系(2)

    [转自:http://blog.163.com/hero_213/blog/static/398912142010312024809/ ] 近年来ORM(Object-Relational Mappi ...

  3. Hibernate One-to-One Mappings 一对一关系映射

    Hibernate One-to-One Mappings 一对一关系映射 关键:一对一关系映射和多对一关系映射非常像.仅仅是unique 属性值为 true 样例:一个员工仅仅能有一个地址. Hib ...

  4. 【hibernate】映射继承关系

    [hibernate]映射继承关系 转载:https://www.cnblogs.com/yangchongxing/p/10405151.html ========================= ...

  5. 如何决解项目中hibernate中多对多关系中对象转换json死循环

    先写一下原因吧!我是写的SSH项目,在项目中我遇到的问题是把分页对象(也就是pageBean对象)转化为json数据,下面为代码: public class PageBean <T>{// ...

  6. hibernate学习四(关系映射一对一与组件映射)

    一.关系映射简介 在数据库中,表与表的关系,仅有外键.但使用hibernate后,为面向对象的编程,对象与对象的关系多样化:如 一对一,一对多,多对多,并具有单向和双向之分. 开始练习前,复制上一次项 ...

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

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

  8. hibernate中一对多关系中的inverse,cascade属性

    举例说明: 一对多关系的两张表:boy.girl(一个男孩可以多个女朋友) boy表结构 Field   Type        ------  -----------  name    varcha ...

  9. Hibernate双向多对多对象关系模型映射

    1 双向many-to-many 业务模型: 描述员工和项目 一个员工同时可以参与多个项目 一个项目中可以包含多个员工 分析:数据库的数据模型,通过中间关系表,建立两个one-to-many构成man ...

  10. Hibernate单向一对多对象关系模型映射

    1 hibernate 的对象关系映射 Orm: 类-----表 属性------字段 对象------记录 表:在数据库中存在主外键的关系,反向工厂类是由表生成,在由表生成类的时候,类和类之间存在者 ...

随机推荐

  1. 山峰和山谷 Ridges and Valleys

    题目描述 思路 一开始看这道题目,也不是很会,谁会把统计之类的问题和bfs联系在一起,没有开始的状态,没有结束的状态,题目中连一个最短之类的词也没有出现. 然后统计嘛,题目中说了方格高度都相同,就把周 ...

  2. Go语言【学习】defer和逃逸分析

    defer 什么是defer? defer是Go语言的一中用于注册延迟调用的机制,使得函数活语句可以再当前函数执行完毕后执行 为什么需要defer? Go语言提供的语法糖,减少资源泄漏的发生 如何使用 ...

  3. maven系列:archetype项目模板_create-from-project

    主要介绍create-from-project插件在命令行下的使用. [第一步:生成模板项目] 新建一个maven项目,比如叫 :groupId=com.abc.demo,artifactId=com ...

  4. sqlserver还原差异备份

    因为之前遇到还原差异备份,最开始遇到SQLServer报错:"无法还原日志备份或差异备份,因为没有文件可用于前滚".查阅很多资料后,终于得到解决.收集整理成这篇随笔. 问题原因:出 ...

  5. 2019 网宿科技java面试笔试题 (含面试题解析)

    本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.网宿科技等公司offer,岗位是Java后端开发,最终选择去了网宿科技. 面试了很多家公司,感觉大部分公司考察的点 ...

  6. 设置断点调式 fiddler

    1. 用IE 打开博客园的登录界面  http://passport.cnblogs.com/login.aspx 2. 打开Fiddler,  在命令行中输入bpu http://passport. ...

  7. 【开发笔记】- 发送邮件(通过JavaMail发送)

    前段时间在工作中用到了邮件发送监控的报警信息,今天在这个记录一下JavaMail的邮件工具类. 下边为用到的JavaMail的jar包的pom依赖.这里用的是JavaMail的1.4.6的版本. &l ...

  8. npm全局模块卸载及默认安装目录修改方法

    卸载全局安装模块  npm uninstall -g <package> 卸载后,你可以到 /node_modules/ 目录下查看包是否还存在,或者使用以下命令查看:npm ls npm ...

  9. 前端框架 Vue.js 概述

    Vue.js 是什么 图片 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视 ...

  10. C++类中创建线程

    ​ 经常会遇到需要在类中创建线程,可以使用静态成员函数,并且将类实例的指针传入线程函数的方式来实现. 实现代码代码如下: /* 类头文件 CTestThread.h */ #include<io ...