文档章节

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
425
0
Hibernate从零开始_08_检索方式

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

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

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

architect刘源源
01/11
3
0
Hibernate之关联关系映射(一对多和多对一映射,多对多映射)

~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习一下框架了,不然又被忽悠让去培训。)~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射:   1.1:一对多和...

别叫小伙
2017/03/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux命令备忘录: jobs 显示Linux中的任务列表及任务状态命令

jobs命令用于显示Linux中的任务列表及任务状态,包括后台运行的任务。该命令可以显示任务号及其对应的进程号。其中,任务号是以普通用户的角度进行的,而进程号则是从系统管理员的角度来看的...

开元中国2015
45分钟前
1
0
springboot Whitelabel Error Page(Not Found)解决方案

当出现上图图的错误时注意 报错信息 There was an unexpected error (type=Not Found, status=404). Not Found代表未访问到资源 解决方案:比较访问路径和代码的路径有没有写错 正确的访问路...

斩神魂
45分钟前
1
0
记一次hbase master停止服务的原因以及恢复

在Hdfs空间不足的情况下,拒绝写入,hbase会down掉。如果hdfs空间没有清理的情况下,重新启动hbase,会报splitlog失败,原因是wal日志重写过程中会写hdfs,写不进去导致的。重启不成功。 解决...

PageYi
49分钟前
1
0
如何从平面设计转行到UI设计?

时代的变迁,科技的进步,工具的发展,薪资的差距,促使许多人转行的原因,但平面与界面两者之间有着哪些的差异呢?如果,想要转行又该具备哪些条件呢? 平面、界面设计之间的差异性 平面设计...

mo311
52分钟前
4
0
线程池整理

一般在生产环境中,我们都不会直接new一个Thread,然后再去start(),因为这么做会不断频繁的创建线程,销毁线程,过大的线程会耗尽CPU和内存资源,大量的垃圾回收,也会给GC带来压力,延长GC停顿时间...

算法之名
54分钟前
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部