首页 > 代码库 > Hibernate中双向的一对多关系

Hibernate中双向的一对多关系

何为双向,双向的意思就是你我之间可以互相通信(customer(1)和order(n))

也就是说customer可以访问order,order也可以访问customer

二者构成了双向的关系

在Hibernate中如何实现双向的一对多关系呢??

步骤:
  I在1的一端(也就是customer)添加n端(order)的集合列表,并添加get和set方法

package com.jeremy.hibernate.app.example.both;import java.util.HashSet;import java.util.Set;public class Customer {    private Integer customerId;    private String customerName;        /*     * 1. 声明集合类型时, 需使用接口类型, 因为 hibernate 在获取     * 集合类型时, 返回的是 Hibernate 内置的集合类型, 而不是 JavaSE 一个标准的     * 集合实现.      * 2. 需要把集合进行初始化, 可以防止发生空指针异常     */    private Set<Order> orders = new HashSet<>();    public Integer getCustomerId() {        return customerId;    }    public void setCustomerId(Integer customerId) {        this.customerId = customerId;    }    public String getCustomerName() {        return customerName;    }    public void setCustomerName(String customerName) {        this.customerName = customerName;    }    public Set<Order> getOrders() {        return orders;    }    public void setOrders(Set<Order> orders) {        this.orders = orders;    }}

  II在n端(order)中添加customer属性:
  

package com.jeremy.hibernate.app.example.both;public class Order {        private Integer orderId;    private String orderName;        private Customer customer;    public Integer getOrderId() {        return orderId;    }    public void setOrderId(Integer orderId) {        this.orderId = orderId;    }    public String getOrderName() {        return orderName;    }    public void setOrderName(String orderName) {        this.orderName = orderName;    }    public Customer getCustomer() {        return customer;    }    public void setCustomer(Customer customer) {        this.customer = customer;    }            }

  III.在customer.hbm.xml文件中配置集合order的信息

  

<?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 package="com.atguigu.hibernate.entities.n21.both">        <class name="Customer" table="CUSTOMERS">            <id name="customerId" type="java.lang.Integer">            <column name="CUSTOMER_ID" />            <generator class="native" />        </id>            <property name="customerName" type="java.lang.String">            <column name="CUSTOMER_NAME" />        </property>                <!-- 映射 1 对多的那个集合属性 -->        <!-- set: 映射 set 类型的属性, table: set 中的元素对应的记录放在哪一个数据表中. 该值需要和多对一的多的那个表的名字一致 -->        <!-- inverse: 指定由哪一方来维护关联关系. 通常设置为 true, 以指定由多的一端来维护关联关系 -->        <!-- cascade 设定级联操作. 开发时不建议设定该属性. 建议使用手工的方式来处理 -->        <!-- order-by 在查询时对集合中的元素进行排序, order-by 中使用的是表的字段名, 而不是持久化类的属性名  -->        <set name="orders" table="ORDERS" inverse="true" cascade="delete" order-by="ORDER_NAME DESC">            <!-- 执行多的表中的外键列的名字 -->            <key column="CUSTOMER_ID"></key>            <!-- 指定映射类型 -->            <one-to-many class="Order"/>        </set>            </class>    </hibernate-mapping>

 IV在order.hbm.xml文件中配置many-to-one的信息

<?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 package="com.atguigu.hibernate.entities.n21.both">    <class name="Order" table="ORDERS">        <id name="orderId" type="java.lang.Integer">            <column name="ORDER_ID" />            <generator class="native" />        </id>                <property name="orderName" type="java.lang.String">            <column name="ORDER_NAME" />        </property>                <!--             映射多对一的关联关系。 使用 many-to-one 来映射多对一的关联关系             name: 多这一端关联的一那一端的属性的名字            class: 一那一端的属性对应的类名            column: 一那一端在多的一端对应的数据表中的外键的名字        -->        <many-to-one name="customer" class="Customer" column="CUSTOMER_ID"></many-to-one>    </class></hibernate-mapping>

这样一对多的双向关系就配置完成了

但是一对多关系的双向配置跟单向的一对多关系有什么优点???后面解决!!!!

  

 

Hibernate中双向的一对多关系