在領(lǐng)域模型中,類與類之間最普遍的關(guān)系就是關(guān)聯(lián)關(guān)系在UML中,關(guān)聯(lián)是有方向的 以Customer和Order為例:一個用戶能發(fā)出多個訂單,而一個訂單只能屬于一個客戶。從Order到Customer的關(guān)聯(lián)是多對一關(guān)聯(lián);而從Customer到Order是一對多關(guān)聯(lián)單向n-1 單向n-1關(guān)聯(lián)只需從n的一端可以訪問到1的一端 域模型:從Order到Customer的多對一單向關(guān)聯(lián)需要在Order類中定義一個Customer屬性,而在Customer類中無需定義存放Order對象的集合屬性 關(guān)系數(shù)據(jù)模型:ORDER表中的CUSTOMER_ID參照CUSTOMER表的主鍵
代碼如下:
1 package com.yl.hibernate.entities.n21; 2 3 public class Customer { 4 5 PRivate Integer customerId; 6 private String customerName; 7 public Integer getCustomerId() { 8 return customerId; 9 }10 public void setCustomerId(Integer customerId) {11 this.customerId = customerId;12 }13 public String getCustomerName() {14 return customerName;15 }16 public void setCustomerName(String customerName) {17 this.customerName = customerName;18 }19 20 21 } 1 package com.yl.hibernate.entities.n21; 2 3 public class Order { 4 5 private Integer orderId; 6 private String orderName; 7 8 private Customer customer; 9 10 public Integer getOrderId() {11 return orderId;12 }13 14 public void setOrderId(Integer orderId) {15 this.orderId = orderId;16 }17 18 public String getOrderName() {19 return orderName;20 }21 22 public void setOrderName(String orderName) {23 this.orderName = orderName;24 }25 26 public Customer getCustomer() {27 return customer;28 }29 30 public void setCustomer(Customer customer) {31 this.customer = customer;32 }33 34 35 }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 2014-11-26 19:19:40 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping> 6 <class name="com.yl.hibernate.entities.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>
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 2014-11-26 19:19:40 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping> 6 <class name="com.yl.hibernate.entities.n21.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 <!-- 映射多對一的映射關(guān)系。使用many-to-one 來映射多對一的關(guān)聯(lián)關(guān)系15 name:多這一端關(guān)聯(lián)的一那一端的屬性的名字16 class:一那一端的屬性對應(yīng)的類名17 column:一那一端在多的一端對應(yīng)的數(shù)據(jù)表中的外鍵的名字18 -->19 <many-to-one name="customer" class="com.yl.hibernate.entities.n21.Customer" column="CUSTOMER_ID">20 </many-to-one>21 22 </class>23 </hibernate-mapping>
測試類:
1 package com.yl.hibernate.entities.n21; 2 3 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 private SessionFactory sessionFactory; 17 private Session session; 18 private Transaction transaction; 19 20 @Before 21 public void init() { 22 Configuration configuration = new Configuration().configure(); 23 ServiceRegistry serviceRegistry = 24 new ServiceRegistryBuilder().applySettings(configuration.getProperties()) 25 .buildServiceRegistry(); 26 27 sessionFactory = configuration.buildSessionFactory(serviceRegistry); 28 29 session = sessionFactory.openSession(); 30 31 transaction = session.beginTransaction(); 32 } 33 @After 34 public void destory() { 35 transaction.commit(); 36 37 session.close(); 38 39 sessionFactory.close(); 40 } 41 42 @Test 43 public void testMany2OneSave() { 44 Customer customer = new Customer(); 45 customer.setCustomerName("BB"); 46 47 Order order1 = new Order(); 48 order1.setOrderName("ORDER-3"); 49 50 Order order2 = new Order(); 51 order2.setOrderName("ORDER-4"); 52 53 //設(shè)定關(guān)聯(lián)關(guān)系 54 order1.setCustomer(customer); 55 order2.setCustomer(customer); 56 57 //執(zhí)行save操作:先插入Customer,再插入Order,3條INSERT 58 //先插入1的一端,再插入n的一端,只有INSERT語句 59 /*session.save(customer); 60 61 session.save(order1); 62 session.save(order2);*/ 63 64 //先插入Order,在插入Customer. 3條INSERT, 2條UPDATE 65 //先插入n的一端,再插入1的一端,會多出UPDATE語句 66 //因為在插入多的一端時,無法確定1的一端的外鍵值,所以只能等1的一端插入后,在額外發(fā)送UPDATE語句 67 //推薦先插入1的一端,再插入n的一端 68 session.save(order1); 69 session.save(order2); 70 71 session.save(customer); 72 } 73 74 @Test 75 public void testMany2OneGet() { 76 //1.若查詢多的一端的一個對象,則默認(rèn)情況下,只查詢了多的一端的對象,而沒有查詢關(guān)聯(lián)的1的那一端的對象! 77 Order order = (Order) session.get(Order.class, 2); 78 System.out.println(order.getOrderName()); 79 //2.在需要使用到關(guān)聯(lián)的對象時,才發(fā)送對應(yīng)的SQL語句 80 Customer customer = order.getCustomer(); 81 System.out.println(customer.getCustomerName()); 82 83 //3.在查詢Customer對象時,由多的一端導(dǎo)航到1的一端時, 84 //若此時,session已被關(guān)閉,則默認(rèn)情況下 85 //會發(fā)生懶加載異常 86 87 //4.獲取Order對象時,默認(rèn)情況下,其關(guān)聯(lián)的Customer對象時一個代理對象! 88 } 89 90 @Test 91 public void testUpdate() { 92 Order order = (Order) session.get(Order.class, 2); 93 order.getCustomer().setCustomerName("AAA"); 94 } 95 96 @Test 97 public void testDelete() { 98 //在不設(shè)定級聯(lián)關(guān)系的情況下,且1這一端的對象有 n 的對象在引用, 則不能直接刪除1這一端的對象 99 Customer customer = (Customer) session.get(Customer.class, 1);100 session.delete(customer);101 }102 103 104 105 }
新聞熱點
疑難解答