zoukankan      html  css  js  c++  java
  • 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>

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

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

      

  • 相关阅读:
    在虚拟机中的Linux系统搭建ftp服务器,使用nginx代理,实现外网访问ftp服务器的文件——centos6.5系统中的nginx安装及配置
    在虚拟机中的Linux系统搭建ftp服务器,使用nginx代理,实现外网访问ftp服务器的文件——为虚拟机中的系统设置固定ip
    虚拟机搭建redis单机版及redis-cluster,使用redis desktop manager和java(eclipse)连接redis过程遇到问题汇总
    matlab导出jar包错误Error: An error occurred while shelling out to javac(erro code = 1)解决办法
    java源码学习之String.split()
    Java内部类详解(转)
    Spring入门hello world常见问题及解决办法
    SpringMVC中拦截/和拦截/*的区别
    EasyUI datagrid 笔记
    Mybatis整合Spring
  • 原文地址:https://www.cnblogs.com/jeremy-blog/p/4011964.html
Copyright © 2011-2022 走看看