`

hibernate一对多关联关系配置经验

 
阅读更多

假使有一个order表和一个customer表,那么它们两者的关系是一个customer可以有多个order,一个order只能属于一个customer,在hibernate中,他们的配置如下:

Xml代码
  1. <?xmlversion="1.0"?>
  2. <!DOCTYPEhibernate-mapping
  3. PUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <classname="mypack.Customer"table="CUSTOMERS">
  7. <idname="id"type="long"column="ID">
  8. <generatorclass="increment"/>
  9. </id>
  10. <propertyname="name"type="string">
  11. <columnname="NAME"length="15"/>
  12. </property>
  13. <!--
  14. <set
  15. name="orders"
  16. cascade="all-delete-orphan"
  17. inverse="true"
  18. >
  19. <keycolumn="CUSTOMER_ID"/>
  20. <one-to-manyclass="mypack.Order"/>
  21. </set>
  22. -->
  23. <set
  24. name="orders"
  25. inverse="true"
  26. cascade="save-update"
  27. >
  28. <keycolumn="CUSTOMER_ID"/>
  29. <one-to-manyclass="mypack.Order"/>
  30. </set>
  31. </class>
  32. </hibernate-mapping>

Xml代码
  1. <?xmlversion="1.0"?>
  2. <!DOCTYPEhibernate-mapping
  3. PUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <classname="mypack.Order"table="ORDERS">
  7. <idname="id"type="long"column="ID">
  8. <generatorclass="increment"/>
  9. </id>
  10. <propertyname="orderNumber"type="string">
  11. <columnname="ORDER_NUMBER"length="15"/>
  12. </property>
  13. <many-to-one
  14. name="customer"
  15. column="CUSTOMER_ID"
  16. class="mypack.Customer"
  17. cascade="save-update"
  18. />
  19. </class>
  20. </hibernate-mapping>

他们的业务类中则有以下方法:

Java代码
  1. packagemypack;
  2. importorg.hibernate.*;
  3. importorg.hibernate.cfg.Configuration;
  4. importjava.util.*;
  5. publicclassBusinessService{
  6. publicstaticSessionFactorysessionFactory;
  7. privateLongidOfTom;
  8. privateLongidOfTomOrder;
  9. privateLongidOfJack;
  10. privateLongidOfJackOrder;
  11. static{
  12. try{
  13. Configurationconfig=newConfiguration();
  14. config.configure();
  15. sessionFactory=config.buildSessionFactory();
  16. }catch(RuntimeExceptione){e.printStackTrace();throwe;}
  17. }
  18. publicvoidprintOrdersOfCustomer(LongcustomerId){
  19. Sessionsession=sessionFactory.openSession();
  20. Transactiontx=null;
  21. try{
  22. tx=session.beginTransaction();
  23. Customercustomer=(Customer)session.get(Customer.class,customerId);
  24. printOrders(customer.getOrders());
  25. tx.commit();
  26. }catch(RuntimeExceptione){
  27. if(tx!=null){
  28. tx.rollback();
  29. }
  30. throwe;
  31. }finally{
  32. session.close();
  33. }
  34. }
  35. publicvoidsaveCustomerAndOrderWithCascade(){
  36. Sessionsession=sessionFactory.openSession();
  37. Transactiontx=null;
  38. try{
  39. tx=session.beginTransaction();
  40. Customercustomer=newCustomer("Tom",newHashSet());
  41. Orderorder=newOrder();
  42. order.setOrderNumber("Tom_Order001");
  43. order.setCustomer(customer);
  44. customer.getOrders().add(order);
  45. session.save(customer);
  46. tx.commit();
  47. idOfTom=customer.getId();
  48. idOfTomOrder=order.getId();
  49. }catch(RuntimeExceptione){
  50. if(tx!=null){
  51. tx.rollback();
  52. }
  53. e.printStackTrace();
  54. }finally{
  55. session.close();
  56. }
  57. }
  58. publicvoidassociateCustomerAndOrder(){
  59. Sessionsession=sessionFactory.openSession();
  60. Transactiontx=null;
  61. try{
  62. tx=session.beginTransaction();
  63. Customercustomer=(Customer)session.load(Customer.class,idOfJack);
  64. Orderorder=(Order)session.load(Order.class,idOfJackOrder);
  65. order.setCustomer(customer);
  66. customer.getOrders().add(order);
  67. tx.commit();
  68. }catch(RuntimeExceptione){
  69. if(tx!=null){
  70. tx.rollback();
  71. }
  72. e.printStackTrace();
  73. }finally{
  74. session.close();
  75. }
  76. }
  77. publicvoidsaveCustomerAndOrderSeparately(){
  78. Sessionsession=sessionFactory.openSession();
  79. Transactiontx=null;
  80. try{
  81. tx=session.beginTransaction();
  82. Customercustomer=newCustomer();
  83. customer.setName("Jack");
  84. Orderorder=newOrder();
  85. order.setOrderNumber("Jack_Order001");
  86. session.save(customer);
  87. session.save(order);
  88. tx.commit();
  89. idOfJack=customer.getId();
  90. idOfJackOrder=order.getId();
  91. }catch(RuntimeExceptione){
  92. if(tx!=null){
  93. tx.rollback();
  94. }
  95. e.printStackTrace();
  96. }finally{
  97. session.close();
  98. }
  99. }
  100. publicvoiddeleteCustomer(LongcustomerId){
  101. Sessionsession=sessionFactory.openSession();
  102. Transactiontx=null;
  103. try{
  104. tx=session.beginTransaction();
  105. Customercustomer=(Customer)session.load(Customer.class,customerId);
  106. session.delete(customer);
  107. tx.commit();
  108. }catch(RuntimeExceptione){
  109. if(tx!=null){
  110. tx.rollback();
  111. }
  112. e.printStackTrace();
  113. }finally{
  114. session.close();
  115. }
  116. }
  117. publicvoidremoveOrderFromCustomer(LongcustomerId){
  118. Sessionsession=sessionFactory.openSession();
  119. Transactiontx=null;
  120. try{
  121. tx=session.beginTransaction();
  122. Customercustomer=(Customer)session.load(Customer.class,customerId);
  123. Orderorder=(Order)customer.getOrders().iterator().next();
  124. //½â³ýCustomerºÍOrderµÄ¹ØÁª¹Øϵ
  125. customer.getOrders().remove(order);
  126. order.setCustomer(null);
  127. tx.commit();
  128. }catch(RuntimeExceptione){
  129. if(tx!=null){
  130. tx.rollback();
  131. }
  132. e.printStackTrace();
  133. }finally{
  134. session.close();
  135. }
  136. }
  137. publicvoidprintOrders(Setorders){
  138. for(Iteratorit=orders.iterator();it.hasNext();){
  139. Orderorder=(Order)it.next();
  140. System.out.println("OrderNumberof"+order.getCustomer().getName()+":"+order.getOrderNumber());
  141. }
  142. }
  143. publicvoidsaveCustomerAndOrderWithInverse(){
  144. saveCustomerAndOrderSeparately();
  145. associateCustomerAndOrder();
  146. }
  147. publicvoidtest(){
  148. saveCustomerAndOrderWithCascade();
  149. saveCustomerAndOrderWithInverse();
  150. printOrdersOfCustomer(idOfTom);
  151. deleteCustomer(idOfJack);
  152. removeOrderFromCustomer(idOfTom);
  153. }
  154. publicstaticvoidmain(Stringargs[]){
  155. newBusinessService().test();
  156. sessionFactory.close();
  157. }
  158. }

由以上代码执行时的效率和打印的sql语句,我们可以得出以下经验:1.应把one的一方的<set>元素的inverse属性,设置为true,因此hibernate不会因为customer对象的属性变化来同步更新数据库,以提高性能。 2.在建立关联关系之后,在进行更新操作的时候,最好操作关联两端的对象的相关属性。如:

Java代码
  1. order.setCustomer(customer);
  2. customer.getOrders().add(order);

这样会是程序更加健壮,提高业务逻辑的独立性,使代码不收hibernate实现的影像。同理,当解除双向关联关系时,也该操作关联双发的对应属性,如:

Java代码
  1. customer.getOrders().remove(order);
  2. order.setCustomer(null);

分享到:
评论

相关推荐

    hibernate一对一关联关系

    在实体类之间,Hibernate支持多种关联关系,包括一对一(One-to-One)、一对多(One-to-Many)和多对多(Many-to-Many)。本资源主要探讨的是“hibernate一对一关联关系”。 一对一关联关系在现实世界中很常见,...

    Hibernate ORM - 一对多双向关联关系

    这个压缩包文件“HibernateORM”很可能包含了关于如何在实际项目中设置和使用Hibernate一对多双向关联的示例代码、配置文件或者详细教程。通过学习这些材料,开发者能够深入理解如何在Java应用中利用Hibernate来处理...

    hibernate多对一单向关联关系实现源码

    在Java的持久化框架Hibernate中,多对一(ManyToOne)关联关系是一种常见的对象关系映射(ORM)场景。这种关系通常出现在一个实体类拥有多条与另一个实体类相关的记录,而另一个实体类可能只有一条对应的记录。例如...

    hibernate各种常用关联关系的基本配置

    二、一对多(OneToMany)关联 一个实体可以与多个其他实体相关联,如用户和订单。配置时使用`@OneToMany`注解,可设置`mappedBy`、`fetch`(默认为EAGER,可改为LAZY实现懒加载)和`cascade`(级联操作)等属性。 ...

    Hibernate一对多关联关系小demo

    本篇文章将深入探讨“Hibernate一对多关联关系”这一主题,并结合提供的"hibernateOneToMany"压缩包文件,展示如何实现一个简单的一对多关联关系的小型示例。 首先,我们需要理解Hibernate中的一对多关联关系。在...

    hibernate多对多关联映射

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...

    Hibernate一对多关联映射(注解)

    总结一下,Hibernate的一对多关联映射通过注解方式定义了对象间的关联关系,使得我们在编程时能够以面向对象的方式操作数据,而底层数据库的操作则由Hibernate自动完成。这种方式大大提高了开发效率,同时也降低了...

    hibernate一对多关联映射(单向关联)

    这篇博客文章“hibernate一对多关联映射(单向关联)”将深入讲解如何配置和使用这种映射关系。 在单向关联中,只有一个实体知道另一个实体的存在,也就是说,只有父实体("一"的一端)有对子实体("多"的一端)的...

    hibernate多对一关联关系

    在Java的持久化框架Hibernate中,"多对一"关联关系是一种常见的对象关系映射(ORM)设计,它表示一个实体(子项)可以与多个其他实体(父项)相关联,而每个父项可能被多个子项引用。在数据库层面,这通常对应于一个...

    hibernate实现多对多关联关系源码

    通过阅读源码,可以更深入地理解Hibernate是如何处理多对多关联的,包括映射关系的配置、数据库交互以及关联对象的存取。 总之,理解并正确实现Hibernate的多对多关联关系对于开发高效、健壮的Java应用至关重要。...

    Hibernate多对多关联关系demo

    本示例"Hibernate多对多关联关系demo"将深入探讨如何在实际开发中设置和操作这种关系。我们将探讨以下关键知识点: 1. **映射配置**: 在Hibernate中,多对多关联关系通过`&lt;many-to-many&gt;`标签来实现。你需要在两...

    Hibernate一对多使用非主键关联设置

    在保存或更新实体时,Hibernate会自动处理一对多关联的插入或更新。 通过这种方式,我们就可以在Hibernate中设置一对多非主键关联,使得在操作部门和员工数据时,能够方便地维护它们之间的关系。这种方法允许我们在...

    hibernate多对一关联demo

    本教程将详细解释如何在Hibernate中实现多对一的关联关系,以及如何通过一个实际的示例来演示这一过程。 【描述】:“博客地址:http://blog.csdn.net/smilefyx/article/details/48603923” 在上述博客文章中,...

    hibernate一对多,多对一,一对多双向关联

    本主题将主要聚焦在一对一和一对多关联。 2. **关联的方向性:** 关联可以是单向或双向的。单向关联只能从一个实体访问另一个,而双向关联允许两个实体之间互相访问。 3. **@OneToOne, @OneToMany, @ManyToOne ...

    Hibernate双向一对一关联映射(注解版)

    本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...

    Hibernate关联关系配置

    下面展示了一对多关系在Hibernate中的具体配置方式: **消费者类(Customer)的配置**: ```xml &lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" ...

    Hibernate_关联关系映射配置

    多对多关联是两个实体之间最复杂的关联类型,例如用户可以加入多个群组,群组也可以包含多个用户。在Hibernate中,我们使用`@ManyToMany`注解来实现。通常还需要创建一个中间表来存储两个实体的关联关系,这个中间表...

    hibernate外键实现一对一双向关联关系源码

    本主题将深入探讨如何使用Hibernate实现一对一双向关联关系,并通过源码解析这一过程。 一对一双向关联关系指的是两个实体类之间存在一对一的关系,且在各自的类中都可以直接访问对方。这种关联可以通过注解或XML...

    Hibernate一对多关联实例

    本文将详细解析" Hibernate一对多关联实例 ",并涵盖关联的保存(save)、删除(delete)、查询(select)和更新(update)操作。 一、一对多关联概念 在数据库设计中,一对多关联表示一个表中的记录可以与另一个表中的多个...

    hibernate多对多关联映射(单项关联)

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系模型,它用于处理两个实体类之间存在多个对应关系的情况。这篇博客"hibernate多对多关联映射(单项关联)"深入探讨了如何在Hibernate中实现这种映射...

Global site tag (gtag.js) - Google Analytics