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

     n21:

    1.new 两个实体类,一个代表"多"的一端,一个代表"一"的一端.

    Customer类:

    public class Customer {
    
        private Integer customerId;
        private String customerName;
        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;
        }
        
    }

    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 }

    2.生成关于这两个类的xml文件:

    Order.hbm.xml:

     1 <?xml version="1.0"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC
     3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     4     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     5 
     6 <hibernate-mapping package="n21">
     7 
     8     <!-- 映射类和数据表 -->
     9     <class name="Order" table="ORDERS">
    10         <!-- 映射OID和数据表的主键 -->
    11         <id name="orderId" type="java.lang.Integer">
    12             <column name="ORDER_ID"/>
    13             <!-- 指定主键的生成方式 -->
    14             <generator class="native"/>
    15         </id>
    16         
    17         <!-- 映射属性和字段 -->
    18         <property name="orderName" type="java.lang.String">
    19             <column name="ORDER_NAME"/>
    20         </property>
    21         
    22         <!-- 
    23             映射多对一的关联关系.使用many-to-one来映射多对一的关联关系
    24             name:多这一端关联的一那一端的属性的名字
    25             class:多这一端的属性对应一那一端的类名
    26             column:一那一端在多的一端对应的数据表中的外键的名字
    27          -->
    28         <many-to-one name="customer" class="Customer" column="CUSTOMER_ID"></many-to-one>
    29     </class>
    30 </hibernate-mapping>

    Customer.hbm.xml:

     1 <?xml version="1.0"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC
     3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     4     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     5 
     6 <hibernate-mapping package="n21">
     7 
     8     <!-- 映射类和数据表 -->
     9     <class name="Customer" table="CUSTOMERS">
    10         <!-- 映射OID和数据表的主键 -->
    11         <id name="customerId" type="java.lang.Integer">
    12             <column name="CUSTOMER_ID"/>
    13             <!-- 指定主键的生成方式 -->
    14             <generator class="native"/>
    15         </id>
    16         
    17         <!-- 映射属性和字段 -->
    18         <property name="customerName" type="java.lang.String">
    19             <column name="CUSTOMER_NAME"/>
    20         </property>
    21     </class>
    22 </hibernate-mapping>

    3.hibernate.cfg.xml:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE hibernate-configuration PUBLIC
     3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     4         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
     5 <hibernate-configuration>
     6     <session-factory>
     7     
     8         <!-- hibernate的基本信息 -->
     9         <property name="connection.username">root</property>
    10         <property name="connection.password">root</property>
    11         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    12         <property name="connection.url">jdbc:mysql:///hibernate</property>
    13     
    14         <!-- hibernate的基本配置 -->
    15         
    16         <!-- hibernate使用的数据库方言 -->
    17         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    18         
    19         <!-- 运行时是否打印sql语句 -->
    20         <property name="show_sql">true</property>
    21         
    22         <!-- 运行时是否格式化sql -->
    23         <property name="format_sql">true</property>
    24         
    25         <!-- 生成数据表的策略  这里是更新-->
    26         <property name="hbm2ddl.auto">update</property>
    27         
    28         <!-- 设置hibernate的事务隔离级别 -->
    29         <property name="connection.isolation">2</property>
    30         
    31         <!-- 需要关联的hibernate映射文件 .hbm.xml -->
    32         <!-- 
    33         <mapping resource="n21/Customer.hbm.xml"/>
    34         <mapping resource="n21/Order.hbm.xml"/>
    35          -->
    36         <mapping resource="n21/both/Customer.hbm.xml"/>
    37         <mapping resource="n21/both/Order.hbm.xml"/>
    38         
    39         
    40     </session-factory>
    41 </hibernate-configuration>

    4.Hibernate测试类:

      1 package n21;
      2 
      3 import org.hibernate.LazyInitializationException;
      4 import org.hibernate.Session;
      5 import org.hibernate.SessionFactory;
      6 import org.hibernate.Transaction;
      7 import org.hibernate.cfg.Configuration;
      8 import org.hibernate.service.ServiceRegistry;
      9 import org.hibernate.service.ServiceRegistryBuilder;
     10 import org.junit.After;
     11 import org.junit.Before;
     12 import org.junit.Test;
     13 
     14 public class HibernateTest {
     15 
     16     //生产环境中Session和Transaction是不能作为成员变量的,因为可能有并发的问题
     17     private SessionFactory sessionFactory;
     18     private Session session;
     19     private Transaction transaction;
     20     
     21     @Before
     22     public void init(){
     23         //1.创建一个SessionFactory对象
     24         //1).创建Configuration对象:对应hibernate的基本配置信息和对象关系映射信息
     25         Configuration configuration=new Configuration().configure();
     26         //2).创建一个ServiceRegistry对象:hibernate 4.x新添加的对象
     27         //hibernate的任何配置和服务都需要在该对象中注册后才能有效.
     28         ServiceRegistry serviceRegistry=
     29                 new ServiceRegistryBuilder().applySettings(configuration.getProperties())
     30                                                .buildServiceRegistry();
     31         //3).获得到SessionFactory对象
     32         sessionFactory=configuration.buildSessionFactory(serviceRegistry);
     33         //2.创建一个Session对象
     34         session=sessionFactory.openSession();
     35         //3.开启事务
     36         transaction=session.beginTransaction();
     37     }
     38     
     39     @After
     40     public void destroy(){
     41         //5.提交事务
     42         transaction.commit();
     43         //6.关闭Session
     44         session.close();
     45         //7.关闭SessionFactory对象
     46         sessionFactory.close();
     47     }
     48     
     49     @Test
     50     public void testDelete(){
     51         //在不设定级联关系的情况下,且1这一端的对象有n那一端的对象在引用,不能直接删除1这一端的对象
     52         Customer customer=(Customer) session.get(Customer.class, 1);
     53         session.delete(customer);
     54     }
     55     
     56     @Test
     57     public void testUpdate(){
     58         Order order=(Order) session.get(Order.class, 1);
     59         order.getCustomer().setCustomerName("AAA");
     60     }
     61     
     62     @Test
     63     public void testManyToOneGet(){
     64         //1.若查询多的一端的一个对象,则默认情况下,只查询了多的一端的对象,而没有查询关联的
     65         //一的那一端的对象!--(延迟加载)?
     66         Order order=(Order) session.get(Order.class, 1);
     67         System.out.println(order.getOrderName());
     68         
     69         System.out.println(order.getCustomer().getClass().getName());
     70         
     71         //session.close();
     72         
     73         //2.在需要使用到关联的对象时,才发送对应的SQL语句. 也叫懒加载
     74         Customer customer=order.getCustomer();
     75         System.out.println(customer.getCustomerName());
     76         
     77         //3.在查询Customer对象时,由多的一端导航到1的一端时,
     78         //若此时session已经被关闭,则默认情况下
     79         //会发生LazyInitializationException 异常
     80         
     81         //4.获取Order对象时,默认情况下,其关联的Customer对象是一个代理对象!
     82     }
     83     
     84     @Test
     85     public void testManyToOneSave(){
     86         Customer customer=new Customer();
     87         customer.setCustomerName("AA");
     88         
     89         Order order1=new Order();
     90         order1.setOrderName("ORDER-1");
     91         
     92         Order order2=new Order();
     93         order2.setOrderName("ORDER-2");
     94         
     95         //设置关联关系
     96         order1.setCustomer(customer);
     97         order2.setCustomer(customer);
     98         
     99         //执行save操作:先插入Customer,再插入Order.3条INSERT
    100         //先插入1的一端,再插入n的一端,只有INSERT语句
    101         session.save(customer);
    102         session.save(order1);
    103         session.save(order2);
    104         
    105         //先插入Order,再插入Customer.3条INSERT,2条UPDATE
    106         //先插入n的一端,再插入1的一端,会多出UPDATE语句!
    107         //原因:因为在插入多的一端时,无法确定1的那端的外键值.所以只能等1的那端插入后,再额外发送UPDATE语句.
    108         //推荐先插入1的一端,后插入n的一端
    109 //        session.save(order1);
    110 //        session.save(order2);
    111 //        
    112 //        session.save(customer);
    113     }
    114 }
  • 相关阅读:
    Html.Partial和Html.RenderPartial, Html.Action和Html.RenderAction的区别
    cygwin下git出现cabundle.crt相关错误的解决办法
    Orchard CMS前台页面为什么没有Edit链接?
    Entity Framework练习题
    分析Autofac如何实现Controller的Ioc(Inversion of Control)
    在Winform,Silvelight,WPF等程序中访问Asp.net MVC web api
    适合.net程序员的.gitignore文件
    如何处理Entity Framework中的DbUpdateConcurrencyException异常
    Asp.net MVC中repository和service的区别
    smplayer中使用srt字幕乱码问题
  • 原文地址:https://www.cnblogs.com/zx-n/p/5181277.html
Copyright © 2011-2022 走看看