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

现在我们就讲的是一对多

把实体及配置文件导入

Order

  1. /**
  2. * hibernate关联关系
  3. * 一对多:一个订单对应多个订单项
  4. * 多对一:多个订单项对应一个订单(注:一个订单项对应一个订单)
  5. * @author Administrator
  6. *
  7. */
  8. public class Order implements Serializable {
  9. //订单id
  10. private Integer orderId;
  11. //订单编号
  12. private String orderNO;
  13.  
  14. //1.1 关联指的是类之间的引用关系。如果Order与类OrderItem关联,
  15. //那么被引用的OrderItem将被定义为Order 的属性。例如:
  16. private Set<OrderItem> orderitems=new HashSet<OrderItem>();
  17.  
  18. public Set<OrderItem> getOrderitems() {
  19. return orderitems;
  20. }
  21. public void setOrderitems(Set<OrderItem> orderitems) {
  22. this.orderitems = orderitems;
  23. }
  24. public Integer getOrderId() {
  25. return orderId;
  26. }
  27. public void setOrderId(Integer orderId) {
  28. this.orderId = orderId;
  29. }
  30. public String getOrderNO() {
  31. return orderNO;
  32. }
  33. public void setOrderNO(String orderNO) {
  34. this.orderNO = orderNO;
  35. }
  36. public Order() {
  37. super();
  38. }
  39. @Override
  40. public String toString() {
  41. return "Order [orderId=" + orderId + ", orderNO=" + orderNO + ", orderitems=" + orderitems + "]";
  42. }
  43.  
  44. }

Order.hbm.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="com.hmc.hibernate02.entity.Order" table="t_order_hb">
  7. <id name="orderId" type="java.lang.Integer" column="order_id">
  8. <!--native:identity(标识列)+sequence(序列) -->
  9. <generator class="native"></generator>
  10. </id>
  11. <property name="orderNO" type="java.lang.String" column="order_no"/>
  12. <!--一方中的主键就是多方中的外键 -->
  13. <!--
  14. select o.*,oi.* from t_order_hb o inner join t_order_item_hb oi
  15. on o.order_id=oi.oid
  16. -->
  17.  
  18. <!--建立关联关系 -->
  19. <!--
  20. name:实体类中定义的属性名,指向多方
  21. cassade:用来控制如何操作关联的持久化对象的
  22.  
  23. -->
  24. <set name="orderitems" cascade="save-update" inverse="true" table="t_order_item_hb" >
  25. <!-- 指定连接的多方中的外键列 -->
  26. <key column="oid"></key>
  27. <!--指定实体之间的关联关系:一对多 -->
  28. <!--class:指向的是多方的实体类的全路径名 -->
  29. <one-to-many class="com.hmc.hibernate02.entity.OrderItem"/>
  30. </set>
  31. </class>
  32.  
  33. </hibernate-mapping>

OrderItem

  1. /**
  2. * 多个订单项对应一个订单(注意:一个订单项唯一对应一个订单)
  3. * @author Administrator
  4. *
  5. */
  6. public class OrderItem implements Serializable{
  7. //订单项id
  8. private Integer orderItemId;
  9. //产品id
  10. private Integer productId;
  11. //数量
  12. private Integer quantity;
  13. //外键列
  14. private Integer oid;
  15.  
  16. //1.1 关联指的是类之间的引用关系。如果OrderItem与类Order关联,
  17. //那么被引用的Order将被定义为OrderItem 的属性。例如:
  18. private Order order;
  19.  
  20. public Order getOrder() {
  21. return order;
  22. }
  23. public void setOrder(Order order) {
  24. this.order = order;
  25. }
  26. public Integer getOrderItemId() {
  27. return orderItemId;
  28. }
  29. public void setOrderItemId(Integer orderItemId) {
  30. this.orderItemId = orderItemId;
  31. }
  32. public Integer getProductId() {
  33. return productId;
  34. }
  35. public void setProductId(Integer productId) {
  36. this.productId = productId;
  37. }
  38. public Integer getQuantity() {
  39. return quantity;
  40. }
  41. public void setQuantity(Integer quantity) {
  42. this.quantity = quantity;
  43. }
  44. public Integer getOid() {
  45. return oid;
  46. }
  47. public void setOid(Integer oid) {
  48. this.oid = oid;
  49. }
  50. @Override
  51. public String toString() {
  52. return "OrderItem [orderItemId=" + orderItemId + ", productId=" + productId + ", quantity=" + quantity
  53. + ", oid=" + oid + "]";
  54. }

OrderItem.hbm.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="com.hmc.hibernate02.entity.OrderItem" table="t_order_item_hb">
  7. <id name="orderItemId" type="java.lang.Integer" column="order_item_id">
  8. <!--native:identity(标识列)+sequence(序列) -->
  9. <generator class="native"></generator>
  10. </id>
  11. <property name="productId" type="java.lang.Integer" column="product_id"/>
  12. <property name="quantity" type="java.lang.Integer" column="quantity"/>
  13. <property insert="false" update="false" name="oid" type="java.lang.Integer" column="oid"/>
  14. <!--建立关联关系 -->
  15. <!-- name:实体类中定义的属性名,指向一方 -->
  16. <many-to-one name="order" cascade="save-update" class="com.hmc.hibernate02.entity.Order">
  17. <!--多方的数据库表中的外键列,指向一方 -->
  18. <column name="oid"></column>
  19. </many-to-one>
  20.  
  21. </class>
  22.  
  23. </hibernate-mapping>

OrderDao

  1. public void add(Order order) {
  2. Session session = SessionFactoryUtils.openSession();
  3. Transaction transaction = session.beginTransaction();
  4. session.save(order);
  5. transaction.commit();
  6. SessionFactoryUtils.closeSession();
  7. }
  8.  
  9. public Order get(Order order) {
  10. Session session = SessionFactoryUtils.openSession();
  11. Transaction transaction = session.beginTransaction();
  12. Order o = session.get(Order.class, order.getOrderId());
  13. //处理懒加载
  14. if(null!=o) {
  15. Hibernate.initialize(o.getOrderitems());
  16. }
  17. transaction.commit();
  18. SessionFactoryUtils.closeSession();
  19. return o;
  20. }
  21.  
  22. public void update(Order order){
  23.  
  24. Session session = SessionFactoryUtils.openSession();
  25. Transaction transaction = session.beginTransaction();
  26. //先查,再更新
  27. Order o = session.get(Order.class, order.getOrderId());
  28. if(null!=o) {
  29. //拿到多方
  30. Set<OrderItem> orderitems = o.getOrderitems();
  31.  
  32. OrderItem orderItem=null;
  33. for (int i = 0; i <=2; i++) {
  34. orderItem=new OrderItem();
  35. orderItem.setProductId(i);
  36. orderItem.setQuantity(i+2);
  37.  
  38. //建立关联关系
  39. orderItem.setOrder(o);
  40. o.getOrderitems().add(orderItem);
  41. }
  42. session.update(o);
  43. }
  44. transaction.commit();
  45. SessionFactoryUtils.closeSession();
  46.  
  47. }
  48.  
  49. //级联删除
  50. public void delete(Order order) {
  51. Session Session = SessionFactoryUtils.openSession();
  52. Transaction Transaction = Session.beginTransaction();
  53. //先查询,在删除
  54. Order o = Session.get(Order.class, order.getOrderId());
  55. if(null!=o) {
  56.  
  57. /**
  58. * 解除关联关系:先删从表,再删主表
  59. * 1)禁用联级删除
  60. * 2)先删从表,再删主表
  61. * 3)手动代码维护
  62. */
  63. Set<OrderItem> orderitems = o.getOrderitems();
  64. for (OrderItem orderItem : orderitems) {
  65. Session.delete(orderItem);
  66. }
  67. Session.delete(o);
  68. }
  69.  
  70. Transaction.commit();
  71. SessionFactoryUtils.closeSession();
  72. }

测试类进行测试OrderDaoTest

  1. Hibernate:
  2. select
  3. order0_.order_id as order_id1_0_0_,
  4. order0_.order_no as order_no2_0_0_
  5. from
  6. t_order_hb order0_
  7. where
  8. order0_.order_id=?
  9. Hibernate:
  10. select
  11. orderitems0_.oid as oid4_1_0_,
  12. orderitems0_.order_item_id as order_it1_1_0_,
  13. orderitems0_.order_item_id as order_it1_1_1_,
  14. orderitems0_.product_id as product_2_1_1_,
  15. orderitems0_.quantity as quantity3_1_1_,
  16. orderitems0_.oid as oid4_1_1_
  17. from
  18. t_order_item_hb orderitems0_
  19. where
  20. orderitems0_.oid=?
  21. Hibernate:
  22. delete
  23. from
  24. t_order_item_hb
  25. where
  26. order_item_id=?
  27. Hibernate:
  28. delete
  29. from
  30. t_order_item_hb
  31. where
  32. order_item_id=?
  33. Hibernate:
  34. delete
  35. from
  36. t_order_item_hb
  37. where
  38. order_item_id=?
  39. Hibernate:
  40. delete
  41. from
  42. t_order_hb
  43. where
  44. 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. 一文读懂 IPv4 到 IPv6 的过渡技术

    在介绍 IPv4 到 IPv6 过渡技术之前,我们先来简单了解一下 IPv4 和 IPv6.什么是 IPv4?IPv4 全称为 Internet Protocol version 4,它为互联网上的每 ...

  2. 闭锁CountDownLatch与栅栏CyclicBarrier

    https://blog.csdn.net/lmc_wy/article/details/7866863   闭锁CountDownLatch与栅栏CyclicBarrier     浅谈 java ...

  3. Jboss部署SpringBoot2 JPA

    Jboss部署SpringBoot2 JPA 目录结构 . └── webapp └── META-INF ├── jboss-deployment-structure.xml └── jboss-w ...

  4. JavaScript之控制标签css

    控制标签css标签.style.样式='样式具体的值'如果样式出现中横线,如border-radius,将中横线去掉,中横线后面的单词首字母大写,写成borderRadius如果原来就要该样式,表示修 ...

  5. mysql配置临时日志(无需重启服务)

    use mysql; //指定日志的存储方式 SET GLOBAL log_output = 'TABLE'; //查询日志开启 SET GLOBAL general_log = 'ON'; sele ...

  6. 学习操作系统和Linux内核的新体会

    算起来是第三次看内核了吧,要从源码的细节中爬出来: (1)先拎清楚主要的数据结构,就把握住了骨架: (2)再看每个系统调用的功能的流程是如何围绕上述数据结构展开.举个栗子,块设备驱动层的主要数据结构有 ...

  7. jhipster技术栈研究

    背景: 公司新的微服务项目都用jhipster脚手架来开发,这篇博客是jhipster里面涉及到技术的汇总目录 一.官方文档中涉及到的技术栈 前端技术栈 Angular / React / Vue R ...

  8. VS调试 DataTable (转载)

    调试的时候遇到一个问题:不知道怎么在自动窗口或者添加监视那里查看DataSet或者DataTable的具体的值.度娘了一下很多都是添加DataTable.Rows[][]监视,但是一行一列地看还是有点 ...

  9. tp5中在where中使用in

    $where = array(); $where['id'] = array('in', $uid_str); $res = $this->db2->name('user')->wh ...

  10. plsql连接数据库后备注乱码|plsql连接数据库后中文乱码

    -- 背景:连接开发库后查阅单表备注信息时发现所有的备注都显示为"???????". -- 解决方案: -- (1). 首先先确认数据库的编码格式字符集,查询数据库编码格式. -- ...