国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Hibernate4.x之映射關(guān)系--單向一對多

2019-11-14 22:02:18
字體:
供稿:網(wǎng)友
Hibernate4.x之映射關(guān)系--單向一對多

在領(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 }


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 敖汉旗| 奉贤区| 馆陶县| 沽源县| 平塘县| 甘孜| 井研县| 丹棱县| 卢湾区| 邵东县| 洮南市| 龙州县| 新乐市| 利辛县| 泰安市| 桂林市| 平武县| 自贡市| 会宁县| 咸阳市| 嘉兴市| 五华县| 宜昌市| 墨脱县| 枣庄市| 呼图壁县| 凯里市| 阜南县| 嫩江县| 马边| 邯郸市| 锡林浩特市| 龙口市| 西林县| 新龙县| 文山县| 漯河市| 清水河县| 阜新| 新余市| 吴旗县|