`

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

 
阅读更多

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

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping >

  <class name="mypack.Customer" table="CUSTOMERS" >
    <id name="id" type="long" column="ID">
      <generator class="increment"/>
    </id>

    <property name="name" type="string" >
        <column name="NAME" length="15" />
    </property>
<!--

    <set 
        name="orders"
        cascade="all-delete-orphan" 
        inverse="true"
         >
        
        <key column="CUSTOMER_ID" />
        <one-to-many class="mypack.Order" />
     </set>   
-->
    <set 
        name="orders"
        inverse="true"
        cascade="save-update" 
        >
        
        <key column="CUSTOMER_ID" />
        <one-to-many class="mypack.Order" />
     </set>   

  </class>
</hibernate-mapping>

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping >

   <class name="mypack.Order" table="ORDERS">
     
      <id name="id" type="long" column="ID">
        <generator class="increment"/>
      </id>
   
      <property name="orderNumber" type="string" >
        <column name="ORDER_NUMBER" length="15" />
      </property>
      
      <many-to-one
        name="customer"
        column="CUSTOMER_ID"
        class="mypack.Customer"
        cascade="save-update"
       />

    </class>
 
</hibernate-mapping>

 

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

package mypack;

import org.hibernate.*;
import org.hibernate.cfg.Configuration;
import java.util.*;

public class BusinessService{
  public static SessionFactory sessionFactory;
  private Long idOfTom;
  private Long idOfTomOrder;
  private Long idOfJack;
  private Long idOfJackOrder;

  static{
     try{
       Configuration config = new Configuration();
       config.configure();
       sessionFactory = config.buildSessionFactory();
    }catch(RuntimeException e){e.printStackTrace();throw e;}
  }

  public void printOrdersOfCustomer(Long customerId){
    Session session = sessionFactory.openSession();
    Transaction tx = null;
    try {
      tx = session.beginTransaction();
      Customer customer=(Customer)session.get(Customer.class,customerId);
      printOrders(customer.getOrders());
      tx.commit();
    }catch (RuntimeException e) {
      if (tx != null) {
         tx.rollback();
      }
      throw e;
    } finally {
       session.close();
    }
  }

  public void saveCustomerAndOrderWithCascade(){
    Session session = sessionFactory.openSession();
    Transaction tx = null;
    try {
      tx = session.beginTransaction();

      Customer customer=new Customer("Tom",new HashSet());
      Order order=new Order();
      order.setOrderNumber("Tom_Order001");

      order.setCustomer(customer);
      customer.getOrders().add(order);

      session.save(customer);
      tx.commit();
      idOfTom=customer.getId();
      idOfTomOrder=order.getId();  
                  
    }catch (RuntimeException e) {
      if (tx != null) {
        tx.rollback();
      }
      e.printStackTrace();
    } finally {
      session.close();
    }
  }

    public void associateCustomerAndOrder(){
    Session session = sessionFactory.openSession();
    Transaction tx = null;
    try {
      tx = session.beginTransaction();
      Customer customer=(Customer)session.load(Customer.class,idOfJack);
      Order order=(Order)session.load(Order.class,idOfJackOrder);
      order.setCustomer(customer);
      customer.getOrders().add(order);
      tx.commit();
    }catch (RuntimeException e) {
      if (tx != null) {
        tx.rollback();
      }
       e.printStackTrace();
    } finally {
      session.close();
    }
  }

  public void saveCustomerAndOrderSeparately(){
    Session session = sessionFactory.openSession();
    Transaction tx = null;
    try {
      tx = session.beginTransaction();

      Customer customer=new Customer();
      customer.setName("Jack");

      Order order=new Order();
      order.setOrderNumber("Jack_Order001");

      session.save(customer);
      session.save(order);
      
      tx.commit();
      idOfJack=customer.getId();
      idOfJackOrder=order.getId(); 
    }catch (RuntimeException e) {
      if (tx != null) {
        tx.rollback();
      }
       e.printStackTrace();
    } finally {
      session.close();
    }
  }

  public void deleteCustomer(Long customerId){
    Session session = sessionFactory.openSession();
    Transaction tx = null;
    try {
      tx = session.beginTransaction();
      Customer customer=(Customer)session.load(Customer.class,customerId);
      session.delete(customer);
      tx.commit();

    }catch (RuntimeException e) {
      if (tx != null) {
        tx.rollback();
      }
       e.printStackTrace();
    } finally {
      session.close();
    }
  }

  public void removeOrderFromCustomer(Long customerId){
    Session session = sessionFactory.openSession();
    Transaction tx = null;
    try {
      tx = session.beginTransaction();
      Customer customer=(Customer)session.load(Customer.class,customerId);
      Order order=(Order)customer.getOrders().iterator().next();

      //½â³ýCustomerºÍOrderµÄ¹ØÁª¹Øϵ
      customer.getOrders().remove(order);
      order.setCustomer(null);
      tx.commit();

    }catch (RuntimeException e) {
      if (tx != null) {
        tx.rollback();
      }
       e.printStackTrace();
    } finally {
      session.close();
    }
  }

  public void printOrders(Set orders){
      for (Iterator it = orders.iterator(); it.hasNext();) {
         Order order=(Order)it.next();
         System.out.println("OrderNumber of "+order.getCustomer().getName()+ " :"+order.getOrderNumber());
      }
  }

   public void saveCustomerAndOrderWithInverse(){
      saveCustomerAndOrderSeparately();
      associateCustomerAndOrder();
   }
   public void test(){

      saveCustomerAndOrderWithCascade();
      saveCustomerAndOrderWithInverse();
      printOrdersOfCustomer(idOfTom);
      deleteCustomer(idOfJack);
      removeOrderFromCustomer(idOfTom);
  }

  public static void main(String args[]){
    new BusinessService().test();
    sessionFactory.close();
  }
}

 

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

order.setCustomer(customer);
customer.getOrders().add(order);

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

customer.getOrders().remove(order);
order.setCustomer(null);

 

0
2
分享到:
评论
3 楼 diaozhanming 2013-05-03  
bewithme 写道
实际中都基本不用XML配,都用注解,而且基本用JPA。
现在用注解是肯定的,但是jpa的话,现在基本还是都用hibernate的实现,hibernate还是很有用武之地。
2 楼 hellostory 2013-05-02  
为什么网上除了DEMO还是DEMO,真正能解决实际项目开发的没见过,哎!
1 楼 bewithme 2013-05-02  
实际中都基本不用XML配,都用注解,而且基本用JPA。

相关推荐

    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多对一关联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中实现这种映射...

    hibernate一对多、多对一、一对一、多对多配置实例

    本文将深入探讨Hibernate中的一对多、多对一、一对一以及多对多四种关系映射的配置实例,帮助开发者更好地理解和运用这些关系。 ### 一对多关系(One-to-Many) 在数据库设计中,一对多关系是最常见的一种关联,...

Global site tag (gtag.js) - Google Analytics