zoukankan      html  css  js  c++  java
  • hibernate映射-单向多对一映射

     (如有错误或不足之处,敬请指正,不甚感激 ^_^)

    hibernate中单向多对一的映射关系情况:

    单向 n-1 关联只需要从n的一端可以访问1的一端。

    举例: Customer-Order

    一个顾客(Customer)可以同时有多个订单(Order)。在单向多对一的情况中,Customer类中,并没有关于Order的集合属性,Order中有一个Customer属性。(这里就是单向多对一与双向多对一的区别,在双向多对一中,Customer中有一个Set<Order>属性)

     一、代码演示:

    {类文件↓}

    Customer:

     1 public class Customer {
     2     
     3     private Integer customerId;
     4     private String customerName;
     5     
     6     public Integer getCustomerId() {
     7         return customerId;
     8     }
     9     public void setCustomerId(Integer customerId) {
    10         this.customerId = customerId;
    11     }
    12     public String getCustomerName() {
    13         return customerName;
    14     }
    15     public void setCustomerName(String customerName) {
    16         this.customerName = customerName;
    17     }
    18     
    19 }
    Customer.class

    Order:

     1 public class Order {
     2     
     3     private Integer orderId;
     4     private String orderName;
     5     
     6     private Customer customer;
     7 
     8     public Integer getOrderId() {
     9         return orderId;
    10     }
    11 
    12     public void setOrderId(Integer orderId) {
    13         this.orderId = orderId;
    14     }
    15 
    16     public String getOrderName() {
    17         return orderName;
    18     }
    19 
    20     public void setOrderName(String orderName) {
    21         this.orderName = orderName;
    22     }
    23 
    24     public Customer getCustomer() {
    25         return customer;
    26     }
    27 
    28     public void setCustomer(Customer customer) {
    29         this.customer = customer;
    30     }
    31     
    32 }
    Order.class

    在映射文件中:

    Customer是1的一端,Order是多的一端。可想而知,Order表中是有一个外键来指向Customer的。

    {映射文件↓}

    Customer.hbm.xml:

     1 <?xml version="1.0"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     4 <!-- Generated 2015-11-29 10:18:07 by Hibernate Tools 3.4.0.CR1 -->
     5 <hibernate-mapping>
     6     <class name="com.zit.hibernate.n21.Customer" table="CUSTOMERS">
     7         <id name="customerId" type="java.lang.Integer">
     8             <column name="CUSTOMER_ID" />
     9             <generator class="native" />
    10         </id>
    11         <property name="customerName" type="java.lang.String">
    12             <column name="CUSTOMER_NAME" />
    13         </property>
    14     </class>
    15 </hibernate-mapping>
    Customer.hbm.xml

    Order.hbm.xml:

     1 <?xml version="1.0"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     4 <!-- Generated 2015-11-29 10:18:07 by Hibernate Tools 3.4.0.CR1 -->
     5 <hibernate-mapping package="com.zit.hibernate.n21">
     6     <class name="Order" table="ORDERS">
     7         <id name="orderId" type="java.lang.Integer">
     8             <column name="ORDER_ID" />
     9             <generator class="native" />
    10         </id>
    11         <property name="orderName" type="java.lang.String">
    12             <column name="ORDER_NAME" />
    13         </property>
    14         <many-to-one name="customer" class="Customer">
    15             <column name="CUSTOMER_ID" />
    16         </many-to-one>
    17     </class>
    18 </hibernate-mapping>
    Order.hbm.xml

    二、使用注意:

    1.插入时:要先插入1的一端,再插入多的一端。若先插入多的一端,则会多执行UPDATE语句,降低了程序执行效率与性能。(先插入多的一端的值,则它的外键值可能是某个中间值或其他,再插入1的一端的值后,才能将其进行更新操作,所以会多出UPDATE语句)

       session.save(object);

    2.查询时:

       ①查询多的一端的对象时,默认情况下只查询了多的一端的对象,没有查询出对应的1的一端的对象。

           session.get(object.class, num);

       ②在需要使用关联的1的一端的对象时,才会发送对应的SQL语句去查询该对象。

       ③注意懒加载异常(由多的一端导航到1的一端时,可能会发生)

       LazyIniializationException

      ④得到Order对象时,获得的是Customer的代理对象。 

    3.更新时:

    4.删除时:

       ①在1的一端进行删除时,要进行设置级联删除,否则当多的一端有记录在引用该1的一端的记录时,不能删除(若多的一端没有记录在引用该1的一端,则还是可以删除的)。 

    1 <many-to-one name="customer" class="Customer" cascade="delete">
    2             <column name="CUSTOMER_ID" />
    3         </many-to-one>
    Order.hbm.xml设置级联删除

     

  • 相关阅读:
    github打开慢,甚至打不开
    在使用confluent-kafka-go 时遇到如下问题
    Istio Routing极简教程
    kubelet证书过期解决方法
    工具类docker for k8s
    selenium jar包 的下载地址,各版本都有
    使用TestNG进行多浏览器,跨浏览器和并行测试
    简单聊聊TestNG中的并发
    清除Git仓库多余文件及其历史记录 
    【MAVEN】maven系列--pom.xml标签详解
  • 原文地址:https://www.cnblogs.com/zitt/p/5073191.html
Copyright © 2011-2022 走看看