双向多对一 :Customer类------------》一的一端 Order类-----------》多的一端
Customer类:(省略set()、get()和构造方法)
1 private Integer customerId; 2 private String customerName; 3 4 private Set<Order> order = new HashSet<>();
Order类:(省略set()、get()和构造方法)
1 private Integer orderId;
2 private String orderName;
3 private Customer customer;
Customer类的映射文件:
1 <!-- 映射类和数据表 --> 2 <class name="Customer" table="CUSTOMERS"> 3 <!-- 映射OID和数据表的主键 --> 4 <id name="customerId" type="java.lang.Integer"> 5 <column name="CUSTOMER_ID"/> 6 <!-- 指定主键的生成方式 --> 7 <generator class="native"/> 8 </id> 9 10 <!-- 映射属性和字段 --> 11 <property name="customerName" type="java.lang.String"> 12 <column name="CUSTOMER_NAME"/> 13 </property> 14 15 <!-- 映射 1对多的那个集合属性--> 16 <!-- set:映射set类型的属性,table:set中的元素对应的记录放在哪一个数据表中.该值需要和多对一的多的那个表的名字一致 --> 17 <!-- inverse:指定由哪一方来维护关联关系,通常设置为true,以指定由多的一端来维护关联关系 --> 18 <!-- cascade:设定级联操作.值为delete时删除一的这端时会把多的那端的对应记录也删除.delete-orphan解除关系(删除孤儿).save-update级联保存 19 开发时不建议设定该属性.建议使用手工的方式来处理 --> 20 <!-- order-by:在查询时对集合中的元素进行排序,order-by中使用的是表的字段名,而不是持久化类的属性名 --> 21
<set name="order" table="ORDERS" inverse="true" order-by="ORDER_NAME DESC"><!-- 对应那个表inverse反转,放弃维护关联关系 --> 22 <!-- 指定多的表中的外键列的名字 --> 23 <key column="CUSTOMER_ID"></key><!-- 外键名 --> 24 <one-to-many class="Order"/><!-- 指定映射的类型 --> 25 </set>
Order类的映射文件:
1 <class name="Order" table="ORDERS"> 2 <id name="orderId" type="java.lang.Integer"> 3 <column name="ORDER_ID" /> 4 <generator class="native" /> 5 </id> 6 7 <property name="orderName" type="java.lang.String"> 8 <column name="ORDER_NAME" /> 9 </property> 10 11 <many-to-one name="customer" class="com.nzx.hibernate2.n21.both.Customer" column="CUSTOMER_ID"> 12 13 </many-to-one> 14
junit类:
1 package com.nzx.hibernate2.n21.both; 2 3 import static org.junit.Assert.*; 4 5 import org.hibernate.LazyInitializationException; 6 import org.hibernate.Session; 7 import org.hibernate.SessionFactory; 8 import org.hibernate.Transaction; 9 import org.hibernate.cfg.Configuration; 10 import org.hibernate.service.ServiceRegistry; 11 import org.hibernate.service.ServiceRegistryBuilder; 12 import org.junit.After; 13 import org.junit.Before; 14 import org.junit.Test; 15 16 public class HibernateTest { 17 18 19 20 private SessionFactory sessionFactory; 21 private Session session; 22 private Transaction transaction; 23 24 @Before 25 public void init() { 26 27 // 读取hibernate.cfg.xml文件 28 Configuration cfg = new Configuration().configure(); 29 30 ServiceRegistry serviceRigestry = new ServiceRegistryBuilder() 31 .applySettings(cfg.getProperties()).buildServiceRegistry(); 32 33 sessionFactory = cfg.buildSessionFactory(serviceRigestry); 34 35 session = sessionFactory.openSession(); 36 transaction = session.beginTransaction(); 37 } 38 39 @After 40 public void destroy() { 41 42 // 关闭session、sessionFactory 43 44 transaction.commit(); 45 session.close(); 46 sessionFactory.close(); 47 } 48 49 @Test 50 public void testMany2One(){ 51 Customer customer = new Customer(); 52 customer.setCustomerName("BB"); 53 54 Order order1 = new Order(); 55 order1.setOrderName("ORDER_9"); 56 57 Order order2 = new Order(); 58 order2.setOrderName("ORDER_7"); 59 60 61 //设定关联关系 62 order1.setCustomer(customer); 63 order2.setCustomer(customer); 64 65 customer.getOrder().add(order1); 66 customer.getOrder().add(order2); 67 68 /* 69 * 先插入一的一端 70 */ 71 session.save(customer); 72 session.save(order1); 73 session.save(order2); 74 75 /* 76 * 先插入多的一端 77 * 78 */ 79 // session.save(order1); 80 // session.save(order2); 81 // session.save(customer); 82 } 83 84 85 86 }