文档章节

Hibernate从零开始_05_一对多关系

落泪归枫
 落泪归枫
发布于 2014/01/04 09:43
字数 1524
阅读 138
收藏 5

1、POJO的建立

/**
 * 客户表
 */
public class TbUser {
 private Long id;
 private String name;
 private Long age;
 private String city;
 
 //订单
 private Set<Order> orders = new HashSet<Order>();
 
 public TbUser(){
  
 }
 public Long getId() {
  return id;
 }
 public void setId(Long id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Long getAge() {
  return age;
 }
 public void setAge(Long age) {
  this.age = age;
 }
 public String getCity() {
  return city;
 }
 public void setCity(String city) {
  this.city = city;
 }
 
 @Override
 public String toString() {
  return "TbUser [id=" + id + ", name=" + name + ", age=" + age
    + ", city=" + city + "]";
 }
 public Set<Order> getOrders() {
  return orders;
 }
 public void setOrders(Set<Order> orders) {
  this.orders = orders;
 }
 
}

 

 /**
 * 订单表
 */
public class Order {
 private Long id;
 private String addr;
 private Long totalprice;
 
 //用户
 private TbUser user;
 public Long getId() {
  return id;
 }
 public void setId(Long id) {
  this.id = id;
 }
 public String getAddr() {
  return addr;
 }
 public void setAddr(String addr) {
  this.addr = addr;
 }
 public Long getTotalprice() {
  return totalprice;
 }
 public void setTotalprice(Long totalprice) {
  this.totalprice = totalprice;
 }
 public TbUser getUser() {
  return user;
 }
 public void setUser(TbUser user) {
  this.user = user;
 }
 @Override
 public String toString() {
  return "Order [id=" + id + ", addr=" + addr + ", totalprice="
    + totalprice + ", user=" + user + "]";
 }
 
 
}

2、POJO.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>
  <!-- 映射关系配置   name="POJO类" table="表单名称" catalog="数据库名称,若不指定则使用jdbc中的配置" --> 
  <class name="com.study.hibernate.domain.TbUser" table="tb_user" catalog="db_hibernate" select-before-update="true">
   <!-- 配置主键  name="POJO中对应属性" colum="表单中主键名" type="数据类型" --> 
   <id name="id" column="id" type="java.lang.Long">
    <!-- 主键的生成方式。native:根据底层数据库自动选择 -->
    <generator  class="native"></generator>
   </id>
   <property name="name" column="name" type="java.lang.String"></property>
   <property name="age" column="age" type="java.lang.Long"></property>
   <property name="city" column="city" type="java.lang.String"></property>
   
   <!-- 此处的name是对应实体对象中的属性名 -->
   <!-- cascade级联操作 save-update为自动保存-修改 -->
   <set name="orders" cascade="save-update">
    <!-- 此处的column是对应Order.hbm.xml中many-to-one的column="tb_user_id" -->
    <key column="tb_user_id"/>
    <one-to-many class="com.study.hibernate.domain.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>
  <!-- 映射关系配置   name="POJO类" table="表单名称" catalog="数据库名称,若不指定则使用jdbc中的配置" --> 
  <class name="com.study.hibernate.domain.Order" table="tb_order" catalog="db_hibernate">
   <!-- 配置主键  name="POJO中对应属性" colum="表单中主键名" type="数据类型" --> 
   <id name="id" column="id" type="java.lang.Long">
    <!-- 主键的生成方式。native:根据底层数据库自动选择 -->
    <generator  class="native"></generator>
   </id>
   <property name="addr" column="addr" type="java.lang.String"></property>
   <property name="totalprice" column="totalprice" type="java.lang.Long"></property>
   
   <many-to-one name="user" class="com.study.hibernate.domain.TbUser" column="tb_user_id" />
  </class>
 </hibernate-mapping>

3、测试

    1)级联保存

public void saveTest(){
  Configuration configuration = new Configuration().configure();
  ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();  
  SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
  Session session = sessionFactory.openSession();
  Transaction transaction = session.beginTransaction();
  
  TbUser u = new TbUser();
  u.setName("tl");
  u.setAge(25L);
  u.setCity("beijing");
  
  Order o1 = new Order();
  o1.setAddr("ccccc");
  o1.setTotalprice(100L);
  
  Order o2 = new Order();
  o2.setAddr("ssssss");
  o2.setTotalprice(200L);
  
  u.getOrders().add(o1);
  u.getOrders().add(o2);
  
  o1.setUser(u);
  o2.setUser(u);
  
  session.save(u);
  //当<set> cascade='save-update'时不用写下面保存代码也可保存
//  session.save(o1);    // (1)
//  session.save(o2);    // (2)
  
  transaction.commit();
  session.close();  
  sessionFactory.close();
  
  
  //当没有配置cascade='save-update'并取消(1)(2)注释时 
  //结果1
//  Hibernate: /* insert com.study.hibernate.domain.TbUser */ insert into db_hibernate.tb_user (name, age, city) values (?, ?, ?)
//  Hibernate: /* insert com.study.hibernate.domain.Order */ insert into db_hibernate.tb_order (addr, totalprice, tb_user_id) values (?, ?, ?)
//  Hibernate: /* insert com.study.hibernate.domain.Order */ insert into db_hibernate.tb_order (addr, totalprice, tb_user_id) values (?, ?, ?)
//  Hibernate: /* create one-to-many row com.study.hibernate.domain.TbUser.orders */ update db_hibernate.tb_order set tb_user_id=? where id=?
//  Hibernate: /* create one-to-many row com.study.hibernate.domain.TbUser.orders */ update db_hibernate.tb_order set tb_user_id=? where id=?
  
  //结果2:为没有执行session.save(o1); session.save(o2); Hibernate 自动执行保存O1,O2对象并与user关联
//  Hibernate: /* insert com.study.hibernate.domain.TbUser */ insert into db_hibernate.tb_user (name, age, city) values (?, ?, ?)
//  Hibernate: /* insert com.study.hibernate.domain.Order */ insert into db_hibernate.tb_order (addr, totalprice, tb_user_id) values (?, ?, ?)
//  Hibernate: /* insert com.study.hibernate.domain.Order */ insert into db_hibernate.tb_order (addr, totalprice, tb_user_id) values (?, ?, ?)
//  Hibernate: /* create one-to-many row com.study.hibernate.domain.TbUser.orders */ update db_hibernate.tb_order set tb_user_id=? where id=?
//  Hibernate: /* create one-to-many row com.study.hibernate.domain.TbUser.orders */ update db_hibernate.tb_order set tb_user_id=? where id=?
 }

    2)级联查询

/**
  * 多对一查询
  */
 @Test
 public void queryTest2(){
  Configuration configuration = new Configuration().configure();
  ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();  
  SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
  Session session = sessionFactory.openSession();
  Transaction transaction = session.beginTransaction();
  
  String hql = "from Order o where o.id=1";
  Query query = session.createQuery(hql);
  Order o = (Order) query.uniqueResult();
  
  System.out.println(o);
  
  transaction.commit();
  session.close();  
  sessionFactory.close();
  //结果
  //  Hibernate: /* from Order o where o.id=1 */ select order0_.id as id1_0_, order0_.addr as addr2_0_, order0_.totalprice as totalpri3_0_, order0_.tb_user_id as tb_user_4_0_ from db_hibernate.tb_order order0_ where order0_.id=1
//  Hibernate: /* load com.study.hibernate.domain.TbUser */ select tbuser0_.id as id1_1_0_, tbuser0_.name as name2_1_0_, tbuser0_.age as age3_1_0_, tbuser0_.city as city4_1_0_ from db_hibernate.tb_user tbuser0_ where tbuser0_.id=?
//  Order [id=1, addr=sjz, totalprice=100, user=TbUser [id=12, name=wangliu, age=12, city=bj]]
 }
/**
  * 一对多查询
  */
 //@Test
 public void queryTest3(){
  Configuration configuration = new Configuration().configure();
  ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();  
  SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
  Session session = sessionFactory.openSession();
  Transaction transaction = session.beginTransaction();
  
  String hql = "from TbUser t where t.id=12";
  Query query = session.createQuery(hql);
  TbUser t = (TbUser) query.uniqueResult();
  
  System.out.println(t);
  
  Iterator<Order> it =t.getOrders().iterator();
  while (it.hasNext()) {
   System.out.println(it.next());
  }
  transaction.commit();
  session.close();  
  sessionFactory.close();
//结果
//  Hibernate: /* from TbUser t where t.id=12 */ select tbuser0_.id as id1_1_, tbuser0_.name as name2_1_, tbuser0_.age as age3_1_, tbuser0_.city as city4_1_ from db_hibernate.tb_user tbuser0_ where tbuser0_.id=12
//  TbUser [id=12, name=wangliu, age=12, city=bj]
//  Hibernate: /* load one-to-many com.study.hibernate.domain.TbUser.orders */ select orders0_.tb_user_id as tb_user_4_1_1_, orders0_.id as id1_0_1_, orders0_.id as id1_0_0_, orders0_.addr as addr2_0_0_, orders0_.totalprice as totalpri3_0_0_, orders0_.tb_user_id as tb_user_4_0_0_ from db_hibernate.tb_order orders0_ where orders0_.tb_user_id=?
//  Order [id=2, addr=shanghai, totalprice=211, user=TbUser [id=12, name=wangliu, age=12, city=bj]]
//  Order [id=1, addr=sjz, totalprice=100, user=TbUser [id=12, name=wangliu, age=12, city=bj]]
 }

    3)级联删除

<set name="orders" cascade="delete">
/**
  * 级联删除操作
  */
 @Test
 public void deleteTest2(){
  Configuration configuration = new Configuration().configure();
  ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();  
  SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
  Session session = sessionFactory.openSession();
  Transaction transaction = session.beginTransaction();
  
  TbUser u = new TbUser();
  u.setId(21L);
  session.delete(u);
  
  transaction.commit();
  session.close();  
  sessionFactory.close();
  
  //结果
//  Hibernate: /* delete one-to-many com.study.hibernate.domain.TbUser.orders */ update db_hibernate.tb_order set tb_user_id=null where tb_user_id=?
//  Hibernate: /* delete com.study.hibernate.domain.TbUser */ delete from db_hibernate.tb_user where id=?
 }

    结果:     客户被删除客户所对应的订单的关联ID被设置为NULL。

    4)孤子删除

 <set name="orders" cascade="delete-orphan">
 /**
  * 级联删除操作--孤子删除
  */
 //@Test
 public void deleteTest3(){
  Configuration configuration = new Configuration().configure();
  ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();  
  SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
  Session session = sessionFactory.openSession();
  Transaction transaction = session.beginTransaction();
  
  TbUser u = (TbUser) session.get(TbUser.class, 22L);
  
  
  Order o1 = (Order) session.get(Order.class,new Long(21));
  //Order o2 = new Order();
  
  
  u.getOrders().remove(o1);
  //session.delete(u);
  
  transaction.commit();
  session.close();  
  sessionFactory.close();
  
  //结果
//  Hibernate: /* load com.study.hibernate.domain.Order */ select order0_.id as id1_0_0_, order0_.addr as addr2_0_0_, order0_.totalprice as totalpri3_0_0_, order0_.tb_user_id as tb_user_4_0_0_ from db_hibernate.tb_order order0_ where order0_.id=?
//  Hibernate: /* delete one-to-many com.study.hibernate.domain.TbUser.orders */ update db_hibernate.tb_order set tb_user_id=null where tb_user_id=?
//  Hibernate: /* delete com.study.hibernate.domain.TbUser */ delete from db_hibernate.tb_user where id=?
  
  
  //当cascade="delete-orphan"
  //u.getOrders().remove(o1);
  //结果
//  Hibernate: /* load com.study.hibernate.domain.TbUser */ select tbuser0_.id as id1_1_0_, tbuser0_.name as name2_1_0_, tbuser0_.age as age3_1_0_, tbuser0_.city as city4_1_0_ from db_hibernate.tb_user tbuser0_ where tbuser0_.id=?
//  Hibernate: /* load com.study.hibernate.domain.Order */ select order0_.id as id1_0_0_, order0_.addr as addr2_0_0_, order0_.totalprice as totalpri3_0_0_, order0_.tb_user_id as tb_user_4_0_0_ from db_hibernate.tb_order order0_ where order0_.id=?
//  Hibernate: /* load one-to-many com.study.hibernate.domain.TbUser.orders */ select orders0_.tb_user_id as tb_user_4_1_1_, orders0_.id as id1_0_1_, orders0_.id as id1_0_0_, orders0_.addr as addr2_0_0_, orders0_.totalprice as totalpri3_0_0_, orders0_.tb_user_id as tb_user_4_0_0_ from db_hibernate.tb_order orders0_ where orders0_.tb_user_id=?
//  Hibernate: /* delete one-to-many row com.study.hibernate.domain.TbUser.orders */ update db_hibernate.tb_order set tb_user_id=null where tb_user_id=? and id=?
//  Hibernate: /* delete com.study.hibernate.domain.Order */ delete from db_hibernate.tb_order where id=?
 }

    原始数据:

    

     删除后数据:

    

© 著作权归作者所有

共有 人打赏支持
落泪归枫
粉丝 10
博文 29
码字总数 9938
作品 0
海淀
程序员
私信 提问
史上最简单的Hibernate4视频教程(附源码和笔记)

Hibernate4是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合...

2846613430
2016/04/08
1K
0
Java程序员从笨鸟到菜鸟之(五十四)细谈Hibernate(五)Hibernate一对多关系映射

前几篇系列博客: 细谈Hibernate(一)hibernate基本概念和体系结构 细谈Hibernate(二)开发第一个hibernate基本详解 细谈Hibernate(三)Hibernate常用API详解及源码分析 细谈Hibernate(四...

长平狐
2012/11/12
457
0
Hibernate从零开始_08_检索方式

在实际项目应用中使用最多的就是数据的查询,在这里我们介绍一下Hibernate的几种检索方式: 1、导航对象图检索方式 在使用一对多关系时,一个客户对应多个定单这时我们可以: TbUser user = ...

落泪归枫
2014/01/10
0
0
Hibernate映射——一对多关联映射(七)

一对多关联映射 映射原理 一对多关联映射和多对一的关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端。关联关系都是由多端维护,只是在写映射时发生了变化。 多对一和...

architect刘源源
01/11
3
0
Hibernate从零开始_07_多对多关系(中间表)

1、Hibernate多对多(中间表含多个字段)的把多对多拆分为两个一对多。实现如下: 学生类: /** * 学生表 */public class Student { private Long id; private String name; //与学生课程关联...

落泪归枫
2014/01/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何解决 homebrew 更新慢的问题

之前一直困扰于 Homebrew 的更新速度,曾试过修改更新源(清华、中科大等)的方式,但是并没什么卵用;也试过设置 curl 代理的方式,但是 brew 走的好像不是 curl 的方式,所以也没用。 通过...

whoru
12分钟前
0
0
TiDB EcoSystem Tools 原理解读系列(二)TiDB-Lightning Toolset 介绍

简介 TiDB-Lightning Toolset 是一套快速全量导入 SQL dump 文件到 TiDB 集群的工具集,自 2.1.0 版本起随 TiDB 发布,速度可达到传统执行 SQL 导入方式的至少 3 倍、大约每小时 100 GB,适合...

TiDB
14分钟前
0
0
【Visual Studio 扩展工具】如何在ComponentOneFlexGrid树中显示RadioButton

概述 在ComponentOne Enterprise .NET控件集中,FlexGrid表格控件是用户使用频率最高的控件之一。它是一个功能强大的数据管理工具,轻盈且灵动,以分层的形式展示数据(数据呈现更加直观)。...

葡萄城技术团队
16分钟前
0
0
Maven环境隔离

Maven环境隔离 1. 什么是Maven环境隔离 顾名思义,Maven环境隔离就是将开发中的环境与beat环境、生产环境分隔开,方便进行开发和维护。这个在实际项目中用的还是很多的,如果你的项目用的Mav...

蚂蚁-Declan
16分钟前
1
0
day182-2018-12-19-英语流利阅读-待学习

“性感”时代已去,维密将如何转身? Daniel 2018-12-19 1.今日导读 维多利亚的秘密(Victoria's Secret)这个内衣品牌,最近似乎步入了“中年危机”——曾经打遍天下的“性感”内衣,在主打...

飞鱼说编程
17分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部