一对多实现

1、 实现类

package com.alice.hibernate02.vo;

import java.util.HashSet;
import java.util.Set; public class Customer {
private Integer id;
private String name;
// 一对多:一个客户(当前客户) 拥有 【多个订单】
// * 需要容器存放多个值,一般建议Set (不重复、无序)
// * 参考集合:List、Map、Array等
// ** 建议实例化--使用方便 private Set<Order> orders = new HashSet<Order>();

public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Set<Order> getOrders() {
return orders;
} public void setOrders(Set<Order> orders) {
this.orders = orders;
} }
package com.alice.hibernate02.vo;

public class Order {
private Integer id;
private String name;
//多对一:多个订单属于【一个客户】
private Customer customer;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
}

  2、 配置文件

<?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.alice.hibernate02.vo">
<class name="Customer" table="t_customer">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="name" column="name" type="string"></property>
<!-- 表达一对多关系中的集合
name:集合的属性名称
inverse: 是否将关系的维护反转给对方. 默认值: false
true: 在Customer 中 放弃维护外键关系 cascade :级联操作
save-update:级联保存,级联修改. 保存A时,同时保存B.
delete:删除A,同时删除B,AB都不存在
delete-orphan:孤儿删除,解除关系,同时将B删除,A存在的。
如果需要配置多项,使用逗号分隔。<set cascade="save-update,delete"> all : save-update 和 delete 整合
all-delete-orphan : 三个整合 -->
<set name="orders">
<!--
key 用来描述外键
column : 外键的值
-->
<key column="cid"></key>
<one-to-many class="Order"/>
</set>
</class>
</hibernate-mapping>
<?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.alice.hibernate02.vo">
<class name="Order" table="t_order">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="name" column="name" type="string"></property>
<!-- 表达一对多关系中的集合
name:集合的属性名称
inverse: 是否将关系的维护反转给对方. 默认值: false
true: 在Customer 中 放弃维护外键关系 cascade :级联操作
save-update:级联保存,级联修改. 保存A时,同时保存B.
delete:删除A,同时删除B,AB都不存在
delete-orphan:孤儿删除,解除关系,同时将B删除,A存在的。
如果需要配置多项,使用逗号分隔。<set cascade="save-update,delete"> all : save-update 和 delete 整合
all-delete-orphan : 三个整合 -->
<!-- 表达多对一关系
name: 引用的属性名称
column: 外键的列名
class: 我引用的Order的完整类名
-->
<many-to-one name="customer" column="cid" class="Customer"></many-to-one>
</class>
</hibernate-mapping>

3、一对多操作

 public void test01() {
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction(); Customer cus = new Customer();
cus.setName("alice"); Order o1 = new Order();
o1.setName("apple"); Order o2 = new Order();
o2.setName("banana"); cus.getOrders().add(o1);// 维护关系
cus.getOrders().add(o2);// 维护关系 o1.setCustomer(cus);
o2.setCustomer(cus); session.save(cus);//保存对象
session.save(o1);//保存对象
session.save(o2);//保存对象 tran.commit(); session.close(); }

4、   级联操作(读、理解)

save-update:A保存,同时保存B

delete:删除A,同时删除B,AB都不存在

delete-orphan:孤儿删除,解除关系,同时将B删除,A存在的。

如果需要配置多项,使用逗号分隔。<set cascade="save-update,delete">

all : save-update 和 delete 整合

all-delete-orphan : 三个整合

package com.alice.hibernate02.many;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test; import com.alice.hibernate02.util.HibernateUtil;
import com.alice.hibernate02.vo.Customer;
import com.alice.hibernate02.vo.Order; //测试 一对多关系
public class ManyTest02 { @Test
//增
//我们希望在保存Customer时,自动将未保存的Orders当中的Order保存
//cascade: save-update
public void test01() {
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction(); Customer cus = new Customer();
cus.setName("alice"); Order o1 = new Order();
o1.setName("apple"); Order o2 = new Order();
o2.setName("banana"); cus.getOrders().add(o1);// 维护关系
cus.getOrders().add(o2);// 维护关系 // o1.setCustomer(cus);
// o2.setCustomer(cus); session.save(cus);//保存对象
// session.save(o1);//保存对象
// session.save(o2);//保存对象 tran.commit(); session.close(); }
@Test
//增
//我们希望在保存Customer时,自动将未保存的Orders当中的Order保存
//cascade: save-update
public void test02() {
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction(); Customer cus = (Customer) session.get(Customer.class, 2);//1条 select for(Order o :cus.getOrders()){// 1条 select
o.setName("mike");// 修改订单
} tran.commit();//因为设置级联修改,自动将订单的修改保存到数据 session.close(); }
//cascade: delete
//删除Customer时 ,会将Customer下的订单一并删除
//inverse : false 6条sql语句
//inverse : true 5条sql语句 比上面少一条维护外键
@Test
public void test03() {
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction(); Customer cus = (Customer) session.get(Customer.class, 3);//1条 select session.delete(cus);//删除Customer
// 删除两个Order tran.commit();//因为设置级联修改,自动将订单的修改保存到数据 session.close(); }
//cascade: delete
//操作的两方cascade值都为delete
//需要注意: 千万不要在两方都配置 级联删除. 删除任何一方,会导致整个关系链对象全部删除.
@Test
public void test04() {
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction(); Order o =(Order) session.get(Order.class, 6); session.delete(o);//删除Customer
// 删除两个Order tran.commit();//因为设置级联修改,自动将订单的修改保存到数据 session.close(); } }
package com.alice.hibernate02.many;

import java.util.Iterator;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test; import com.alice.hibernate02.util.HibernateUtil;
import com.alice.hibernate02.vo.Customer;
import com.alice.hibernate02.vo.Order; //测试 一对多关系
public class ManyTest03 {
@Test
//inverse:false
//cascade: delete-orphan 孤儿删除 => 当没有任何外键引用Order时,order 会被删除
public void test02(){
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction(); Customer cus = (Customer) session.get(Customer.class, 4);
Iterator<Order> iter = cus.getOrders().iterator();
//注意: 删除Customer下的订单时,不能使用 c.setOrders(null); c.setOrders(new HashSet());
while(iter.hasNext()){// 遍历Customer下的订单,并将订单删除 => 维护关系
iter.next();
iter.remove();
}
//cascade: all-delete-orphan => 相当于配置 save-update,delete,delete-orphan }
//cascade: all-delete-orphan => 相当于配置 save-update,delete,delete-orphan
@Test
public void fun1(){
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction();
//------------------------------------------------
Customer c = new Customer();
c.setName("tom"); Order o1 = new Order();
o1.setName("肥皂"); Order o2 = new Order();
o2.setName("蜡烛"); c.getOrders().add(o1);//维护关系
c.getOrders().add(o2); //维护关系 session.save(c);
//------------------------------------------------
session.getTransaction().commit();
session.close(); // 游离状态
}
}

hibernate学习(5)——一对多关系表达的更多相关文章

  1. hibernate实体xml一对多关系映射

    单向一对多关系映射: 一个房间对应多个使用者,也就是Room實例知道User實例的存在,而User實例則沒有意識到Room實例. 用户表: package onlyfun.caterpillar; p ...

  2. hibernate学习(5)——多对多关系映射

    1.创建实体和映射 package com.alice.hibernate03.vo; import java.util.HashSet; import java.util.Set; public c ...

  3. [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. Hibernate中的一对多关系详解(2)

    一对多的关系:例如,部门对员工,一个部门可以有多个员工 多对一的关系:例如,员工对部门,多个员工属于一个部门,并且每个员工只能属于一个部门 那么一对多.多对一在数据库中的是怎样表示的呢?好多话都不说了 ...

  5. 【hibernate学习杂记】维护关系的一方和不维护关系的一方的区别与联系

    双向多对一/一对多例子 维护关系一方为User:多方 不维护关系的一方为Group:一方 以下是多方代码: package Hibernate_demo1.Demo8.Entity.OneToMany ...

  6. hibernate学习(设计一对一 关系 映射)

    //主表 package org.crazy.app.domain; import javax.persistence.*; @Entity @Table(name="person_inf& ...

  7. hibernate框架学习笔记8:一对多关系案例

    两个实体类:客户与联系人,一个客户可以有多个联系人 客户类: package domain; import java.util.HashSet; import java.util.Set; //客户实 ...

  8. Hibernate框架学习(六)——一对多&多对一关系

    一.关系表达 1.表中的表达 2.实体中的表达 3.orm元数据中的表达 一对多:(在Customer.hbm.xml中添加) 多对一:(在LinkMan.hbm.xml中添加) 最后别忘了在hibe ...

  9. Hibernate一对多、多对一的关系表达

    一.关系表达: 1.一对多.多对一表的关系: 学生表: 班级表: 在学生表中,学生的学号是主键.在班级表中,班级号是主键,因此,学生表的外键是classno.因此,班级对应学生是一对多,学生对应班级是 ...

随机推荐

  1. CSS自适应布局(左右固定 中间自适应或者右侧固定 左侧自适应)

    经常在工作中或者在面试中会碰到这样的问题,比如我想要个布局 右侧固定宽度 左侧自适应 或者 三列布局 左右固定 中间自适应的问题. 下面我们分别来学习下,当然我也是总结下而已,有如以下方法: 一: 右 ...

  2. POJ 1860(spfa)

    http://poj.org/problem?id=1860 题意:汇率转换,与之前的2240有点类似,不同的是那个题它去换钱的时候,是不需要手续费的,这个题是需要手续费的,这是个很大的不同. 思路: ...

  3. WPF 线程 Dispatcher

    WPF 应用程序从两个线程开始: 一个用于处理呈现 一个用于管理 UI 呈现线程有效地隐藏在后台运行,而UI线程则接收输入.处理事件.绘制屏幕以及运行应用程序代码. 大多数应用程序都使用一个 UI 线 ...

  4. ASM:《X86汇编语言-从实模式到保护模式》越计卷:实模式下对DMA和Sound Blaster声卡的控制

    说实话越计卷作者用了16页(我还是删过的),来讲怎么控制声卡,其实真正归纳起来就那么几点. ★PART1:直接存储访问 1. 总线控制设备(bus master) 在硬件技术不发达的早期,处理器是最重 ...

  5. 开源项目在真机调试(Coding iOS 客户端为例)

    一.前言 iOS 13学习系列:如何在github下载开源项目到本地(Coding iOS 客户端为例)已经把 Coding iOS 客户端源码下载到本地. 但项目进行真机调试遇到很多问题. 二.问题 ...

  6. 各种浏览器的Hack写法(chrome firefox ie等)

    Hack是针对不同的浏览器去写不同的CSS样式,从而让各浏览器能达到一致的渲染效果,那么针对不同的浏览器写不同的CSS CODE的过程,就叫CSS HACK,同时也叫写CSS Hack. 然后将Hac ...

  7. ios cocopods 安装使用及高级教程

    CocoaPods简介 每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如Java语言的Maven,nodejs的npm.随着iOS开发者的增多,业界也出现了为iOS程序提供依赖管理的工具,它的 ...

  8. TFS二次开发系列:一、TFS体系结构和概念

    TFS是Team Fundation Server的简称,是微软VSTS的一部分,它是Microsoft应用程序生命周期管理(ALM)工具的核心协作平台,简单的说它是管理和开发软件项目的整个生命周期的 ...

  9. WCF全面解析学习(1)

    SOA的基本概念和设计思想 SOA并不是仅仅采用Web服务的架构,Web服务只是一种实现SOA的理想技术手段.SOA依赖于开放的标准.SOA的一个目标是让不同的厂商开发的服务能够相互操作. SOA支持 ...

  10. ActiveMQ初体验(转)

    转载地址:http://www.cnblogs.com/diorlv/p/3328712.html 做了修改 首先介绍下MQ,MQ英文名MessageQueue,中文名也就是大家用的消息队列,干嘛用的 ...