成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

精通Hibernate:映射一對(duì)多關(guān)聯(lián)關(guān)系

開(kāi)發(fā) 后端
在域模型中,類(lèi)和類(lèi)之間最普通的關(guān)系就是關(guān)聯(lián)關(guān)系。在UML語(yǔ)言中,關(guān)聯(lián)是有方向的。以客戶(hù)(Customer)和訂單(Order)的關(guān)系為例,一個(gè)客戶(hù)可以發(fā)出多個(gè)訂單,而一個(gè)訂單只能屬于一個(gè)客戶(hù)。

在域模型中,類(lèi)和類(lèi)之間最普通的關(guān)系就是關(guān)聯(lián)關(guān)系。在UML語(yǔ)言中,關(guān)聯(lián)是有方向的。以客戶(hù)(Customer)和訂單(Order)的關(guān)系為例,一個(gè)客戶(hù)可以發(fā)出多個(gè)訂單,而一個(gè)訂單只能屬于一個(gè)客戶(hù)。

從Order到Customer的關(guān)聯(lián)是多對(duì)一關(guān)聯(lián),這意味著每個(gè)Order對(duì)象都會(huì)引用一個(gè)Customer對(duì)象,因此在Order類(lèi)中應(yīng)該定義一個(gè)Customer類(lèi)型的屬性,來(lái)引用所關(guān)聯(lián)的Customer對(duì)象。

從Customer到Order的關(guān)聯(lián)是一對(duì)多的關(guān)聯(lián),這意味著每個(gè)Customer對(duì)象都會(huì)引用一組Order對(duì)象,因此在Customer類(lèi)中應(yīng)該定義一個(gè)集合類(lèi)型的屬性,來(lái)引用所有關(guān)聯(lián)的Order對(duì)象。

一、建立多對(duì)一的單向關(guān)聯(lián)關(guān)系

如上例中,我們只需在Order類(lèi)中定義一個(gè)customer屬性,而在Customer類(lèi)中無(wú)需定義存放Order對(duì)象的集合屬性。

Order.java

  1. package mypack;  
  2.  
  3. public class Order  implements java.io.Serializable {  
  4.      private long id;  
  5.      private String orderNumber;  
  6.      private Customer customer;//定義一個(gè)Customer屬性  
  7.  
  8.     public Order() {  
  9.     }  
  10.  
  11.     public Order(Customer customer) {  
  12.         this.customer = customer;  
  13.     }  
  14.     public Order(String orderNumber, Customer customer) {  
  15.        this.orderNumber = orderNumber;  
  16.        this.customer = customer;  
  17.     }  
  18.      
  19.    //省略了id,orderNumber的構(gòu)造方法  
  20.     public Customer getCustomer() {  
  21.         return this.customer;  
  22.     }  
  23.       
  24.     public void setCustomer(Customer customer) {  
  25.         this.customer = customer;  
  26.     }  
  27.  

Customer類(lèi)的所有屬性都是和CUSTOMERS表中的字段一一對(duì)應(yīng),因此可以直接使用如下的映射代碼:

  1. <class name="mypack.Customer" table="CUSTOMERS" >  
  2.    <id name="id" type="long" column="ID">  
  3.      <generator class="increment"/>  
  4.    </id>  
  5.  
  6.    <property name="name" type="string" >  
  7.        <column name="NAME" length="15" />  
  8.    </property>  
  9.        
  10.  </class

Order類(lèi)的orderNumber屬性和ORDERS表中ORDER_NUMBER字段對(duì)應(yīng),映射代碼和上面類(lèi)似,此處省去。我們關(guān)注的主要地方是,Order類(lèi)中的customer屬性,因?yàn)樗荂ustomer類(lèi)型的,是與ORDERS表的外鍵CUSTOMER_ID對(duì)應(yīng)的,它的真實(shí)值是存在CUSTOMERS表中而ORDERS表存的只是對(duì)它的引用,因此customer的映射方法不能如上面一樣。

  1. <many-to-one  
  2.         name="customer" 
  3.         column="CUSTOMER_ID" 
  4.         class="mypack.Customer" 
  5.         not-null="true"   
  6.         lazy="false" 
  7. /> 

使用方法のBussiness.java演示:

  1. package mypack;  
  2.  
  3. import org.hibernate.*;  
  4. import org.hibernate.cfg.Configuration;  
  5. import java.util.*;  
  6.  
  7. public class BusinessService{  
  8.   public static SessionFactory sessionFactory;  
  9.   static{  
  10.      try{  
  11.       // 初始化  
  12.        Configuration config = new Configuration();  
  13.        config.configure();  
  14.        sessionFactory = config.buildSessionFactory();  
  15.     }catch(RuntimeException e){e.printStackTrace();throw e;}  
  16.   }  
  17. /*根據(jù)參數(shù)指定customer的customer_id找出記錄*/ 
  18.   public List findOrdersByCustomer(Customer customer){  
  19.     Session session = sessionFactory.openSession();  
  20.     Transaction tx = null;  
  21.     try {  
  22.       tx = session.beginTransaction();  
  23.  
  24.       List orders=session.createQuery("from Order as o where o.customer.id="+customer.getId())  
  25.                          .list();  
  26.       //Hibernate執(zhí)行:select * from ORDERS where CUSTOMER_ID=customer.getId();  
  27.       tx.commit();  
  28.       return orders;  
  29.     }catch (RuntimeException e) {  
  30.       if (tx != null) {  
  31.         tx.rollback();  
  32.       }  
  33.       throw e;  
  34.     } finally {  
  35.       session.close();  
  36.     }  
  37.   }  
  38. /*根據(jù)OID找出指定customer_id的記錄*/ 
  39.   public Customer findCustomer(long customer_id){  
  40.     Session session = sessionFactory.openSession();  
  41.     Transaction tx = null;  
  42.     try {  
  43.       tx = session.beginTransaction();  
  44.       Customer customer=(Customer)session.get(Customer.class,new Long(customer_id));  
  45.       tx.commit();  
  46.       return customer;  
  47.     }catch (RuntimeException e) {  
  48.       if (tx != null) {  
  49.         tx.rollback();  
  50.       }  
  51.       throw e;  
  52.     } finally {  
  53.       session.close();  
  54.     }  
  55.   }  
  56.  
  57. /*    
  58.     public void saveCustomerAndOrderWithCascade(){  
  59.     Session session = sessionFactory.openSession();  
  60.     Transaction tx = null;  
  61.     try {  
  62.       tx = session.beginTransaction();  
  63.  
  64.       Customer customer=new Customer("Jack");//創(chuàng)建一個(gè)Customer持久化對(duì)象  
  65.       //不保存customer對(duì)象,這樣執(zhí)行的話(huà)會(huì)出現(xiàn)異常  
  66.       Order order1=new Order("Jack_Order001",customer);  
  67.       Order order2=new Order("Jack_Order002",customer);//創(chuàng)建兩個(gè)Order對(duì)象  
  68.  
  69.       session.save(order1);  
  70.       session.save(order2);  
  71.  
  72.       tx.commit();  
  73.  
  74.     }catch (RuntimeException e) {  
  75.       if (tx != null) {  
  76.         tx.rollback();  
  77.       }  
  78.       e.printStackTrace();  
  79.     } finally {  
  80.       session.close();  
  81.     }  
  82.   }  
  83.  
  84. */  public void saveCustomerAndOrder(){  
  85.     Session session = sessionFactory.openSession();  
  86.     Transaction tx = null;  
  87.     try {  
  88.       tx = session.beginTransaction();  
  89.  
  90.       Customer customer=new Customer("Tom");//創(chuàng)建一個(gè)Customer持久化對(duì)象  
  91.       session.save(customer);  
  92.  
  93.       Order order1=new Order("Tom_Order001",customer);  
  94.       Order order2=new Order("Tom_Order002",customer);//創(chuàng)建兩個(gè)Order對(duì)象  
  95.       session.save(order1);  
  96.       session.save(order2);  
  97.      // 對(duì)同一個(gè)customerHibernate執(zhí)行兩次插入ORDERS表  
  98.       tx.commit();  
  99.  
  100.     }catch (RuntimeException e) {  
  101.       if (tx != null) {  
  102.         tx.rollback();  
  103.       }  
  104.       throw e;  
  105.     } finally {  
  106.       session.close();  
  107.     }  
  108.   }  
  109.     
  110.   public void printOrders(List orders){  
  111.       for (Iterator it = orders.iterator(); it.hasNext();) {  
  112.          Order order=(Order)it.next();  
  113.          System.out.println("OrderNumber of "+order.getCustomer().getName()+ " :"+order.getOrderNumber());  
  114.       }  
  115.   }  
  116.  
  117.    public void test(){  
  118.       saveCustomerAndOrder();  
  119.     //  saveCustomerAndOrderWithCascade();  
  120.       Customer customer=findCustomer(1);  
  121.       List orders=findOrdersByCustomer(customer);  
  122.       printOrders(orders);  
  123.   }  
  124.  
  125.   public static void main(String args[]){  
  126.     new BusinessService().test();  
  127.     sessionFactory.close();  
  128.   }  
  129. }  
  130. <span style="font-size:16px;color:#cc33cc;"><strong>  
  131. </strong></span> 

上述代碼中方法 saveCustomerAndOrderWithCascade()如果沒(méi)有session.save(customer)這一句,

執(zhí)行時(shí)會(huì)拋出PropertyValueException異常,主要原因是:

在調(diào)用session.save(order1)方法之前,order1和customer對(duì)象都是臨時(shí)的,臨時(shí)對(duì)象是由new創(chuàng)建的,都是沒(méi)有持久化的對(duì)象。假設(shè) session.save(order1)被成功執(zhí)行,order1會(huì)被成功持久化,變成持久化對(duì)象,但是Hibernate不會(huì)自動(dòng)持久化order1所關(guān)聯(lián)的customer對(duì)象。

在執(zhí)行session.save(order1)時(shí),插入ORDERS表記錄的CUSTOMER_ID字段為null,這違反了數(shù)據(jù)庫(kù)完整性約束,即ORDERS表中不允許CUSTOMER_ID為null。

疑問(wèn)假設(shè)ORDERS表中CUSTOMER_ID字段允許為null:

  1. <many-to-one  
  2.         name="customer" 
  3.         column="CUSTOMER_ID" 
  4.         class="mypack.Customer" 
  5.         not-null="false"   
  6.         lazy="false" 
  7.      /> 

這樣執(zhí)行的話(huà),能夠成功的向ORDERS表中插入兩條數(shù)據(jù);但是當(dāng)Hibernate自動(dòng)清理(flush)緩存中所有持久化對(duì)象時(shí),又會(huì)拋出新的異常

  1. org.hibernate.TransientObjectException:object references an unsaved transient instance -save the transient instance before flushing :mypack.Customer 

所謂清理是指Hibernate按照持久化對(duì)象的屬性變化來(lái)同步更新數(shù)據(jù)庫(kù)。在清理的時(shí)候Hibernate會(huì)發(fā)現(xiàn)order1和order2都引用臨時(shí)對(duì)象customer,而在ORDERS表中CUSTOMER_ID字段為null,這就意味著內(nèi)存中持久化對(duì)象的屬性和數(shù)據(jù)庫(kù)中記錄不一致。之所以會(huì)報(bào)錯(cuò)是因?yàn)閛rder1中customer屬性引用了一個(gè)臨時(shí)對(duì)象Customer。

由此可見(jiàn),Hibernate持久化一個(gè)對(duì)象時(shí),默認(rèn)情況下不會(huì)自動(dòng)持久化所關(guān)聯(lián)的其他對(duì)象。但是,我們我們希望當(dāng)Hibernate持久化Order對(duì)象時(shí)自動(dòng)持久化所關(guān)聯(lián)的Customer對(duì)象,我們可以修改映射文件如下:

  1. <many-to-one  
  2.         name="customer" 
  3.         column="CUSTOMER_ID" 
  4.         class="mypack.Customer" 
  5.         cascade="save-update" 
  6.         not-null="false"   
  7.         lazy="false" 
  8.      /> 

當(dāng)cascade屬性為“save-update”,表明保存或更新對(duì)象時(shí),會(huì)級(jí)聯(lián)保存或更新與它所關(guān)聯(lián)的對(duì)象。如上例中,執(zhí)行saveCustomerAndOrderWithCascade()時(shí),Hibernate會(huì)把order1與customer對(duì)象一起持久化,此時(shí)Hibernate會(huì)執(zhí)行

  1. insert into CUSTOMERS(ID,NAME) values(2,"Jack");  
  2. insert into ORDERS(ID,ORDER_NUMBER,CUSTOMER_ID) value (3,"Jack_Order001",2); 

#p#

二、映射一對(duì)多雙向關(guān)聯(lián)關(guān)系

類(lèi)類(lèi)之間建立了聯(lián)系,就可以很方便地從一個(gè)對(duì)象導(dǎo)航到另一個(gè)或者另一組與它相關(guān)聯(lián)的對(duì)象。正如上例中,對(duì)于給定的Order對(duì)象,如果想獲得與之關(guān)聯(lián)的Customer對(duì)象,可以直接如下調(diào)用:

  1. Customer customer=order.getCustomer(); 

那么對(duì)于給定的Customer對(duì)象,如何一次獲得所有與之關(guān)聯(lián)的Order對(duì)象呢?由于上例中Customer對(duì)象沒(méi)有和Order對(duì)象關(guān)聯(lián),我們也可以通過(guò)Hibernate API去查詢(xún)數(shù)據(jù)庫(kù):

  1. List orders=session.createQuery("from Order as o where o.customer.id="+customer.getId()).list(); 

顯然這樣做的效率會(huì)很低,而且復(fù)雜的關(guān)聯(lián)關(guān)系也會(huì)給編程帶來(lái)影響。我們可以為Customer類(lèi)和Order類(lèi)簡(jiǎn)歷一對(duì)多的雙向關(guān)聯(lián)。

第一部分我們已經(jīng)建立了Order類(lèi)和Customer類(lèi)的多對(duì)一關(guān)聯(lián),現(xiàn)在我們?cè)僭黾覥ustomer到Order類(lèi)的一對(duì)多關(guān)聯(lián)。

Customer.java文件:

  1. package mypack;  
  2. import java.util.HashSet;  
  3.  
  4. import java.util.Set;  
  5. //Hibernate要求在持久化類(lèi)中定義集合類(lèi)屬性時(shí),必須要把屬性聲明為接口類(lèi)型。  
  6.  
  7. public class Customer  implements java.io.Serializable {  
  8.      private long id;  
  9.      private String name;  
  10.      private Set orders = new HashSet();//初始化為集合實(shí)現(xiàn)類(lèi),這樣做可以提高程序的健壯性,同時(shí)避免了應(yīng)用程序訪(fǎng)問(wèn)取詞為null的orders集合的方法而拋出NullPointerException。  
  11.     public Customer() {  
  12.     }  
  13.  
  14.     public Customer(String name, Set orders) {  
  15.        this.name = name;  
  16.        this.orders = orders;  
  17.     }  
  18.    //省略了id,name的get和set訪(fǎng)問(wèn)方法  
  19.     public Set getOrders() {  
  20.         return this.orders;  
  21.     }  
  22.       
  23.     public void setOrders(Set orders) {  
  24.         this.orders = orders;  
  25.     }  

接下來(lái)就是映射文件的配置Customer.hbm.xml:

  1. <class name="mypack.Customer" table="CUSTOMERS" >  
  2.   <id name="id" type="long" column="ID">  
  3.     <generator class="increment"/>  
  4.   </id>  
  5.  
  6.   <property name="name" type="string" >  
  7.       <column name="NAME" length="15" />  
  8.   </property>  
  9.   <set   
  10.       name="orders" 
  11.       cascade="save-update"   
  12.         
  13.         
  14.       <key column="CUSTOMER_ID" />//表示ORDERS表通過(guò)外鍵CUSTOMER_ID參照CUSTOMERS表  
  15.       <one-to-many class="mypack.Order" />  
  16.    </set>     
  17.  
  18. </class

使用方法のBussiness.java演示分函數(shù)介紹:

(1)saveCustomerAndOrderWithCascade()方法:當(dāng)映射文件中<set>的屬性為“save-update”時(shí),Hibernate在持久化Customer對(duì)象時(shí)也會(huì)自動(dòng)持久化其所關(guān)聯(lián)的Order對(duì)象

  1.   public void saveCustomerAndOrderWithCascade(){  
  2.     Session session = sessionFactory.openSession();  
  3.     Transaction tx = null;  
  4.     try {  
  5.       tx = session.beginTransaction();  
  6. /*創(chuàng)建一個(gè)customer對(duì)象和order對(duì)象*/ 
  7.       Customer customer=new Customer("Tom",new HashSet());  
  8.       Order order=new Order();  
  9.       order.setOrderNumber("Tom_Order001");  
  10. /*建立Customer與Order的一對(duì)多雙向關(guān)聯(lián)關(guān)系*/ 
  11.       order.setCustomer(customer);  
  12.       customer.getOrders().add(order);  
  13. /*保存Customer對(duì)象*/ 
  14.       session.save(customer);  
  15. /* 當(dāng)映射文件中<set>的屬性為“save-update”時(shí),Hibernate在持久化Customer對(duì)象時(shí)也會(huì)自動(dòng)持久化其所關(guān)聯(lián)的Order對(duì)象  
  16.  insert into CUSTOMERS(ID,NAME) values(1,"Tom");  
  17.  insert into ORDERS(ID,ORDER_NUMBER,CUSTOMER_ID) values(1,"Tom_Order001",1)*/ 
  18.       tx.commit();  
  19.       idOfTom=customer.getId();  
  20.       idOfTomOrder=order.getId();    
  21.                     
  22.     }catch (RuntimeException e) {  
  23.       if (tx != null) {  
  24.         tx.rollback();  
  25.       }  
  26.       e.printStackTrace();  
  27.     } finally {  
  28.       session.close();  
  29.     }  
  30.   } 

當(dāng)映射文件中<set>的屬性為“save-update”時(shí),Hibernate在持久化Customer對(duì)象時(shí)也會(huì)自動(dòng)持久化其所關(guān)聯(lián)的Order對(duì)象

  1. insert into CUSTOMERS(ID,NAME) values(1,"Tom");  
  2. insert into ORDERS(ID,ORDER_NUMBER,CUSTOMER_ID) values(1,"Tom_Order001",1

(2)printOrdersOfCustomer(Long customerId)方法:打印與指定customerId關(guān)聯(lián)的所有Order對(duì)象

  1. public void printOrdersOfCustomer(Long customerId){  
  2.   Session session = sessionFactory.openSession();  
  3.   Transaction tx = null;  
  4.   try {  
  5.     tx = session.beginTransaction();  
  6.     Customer customer=(Customer)session.get(Customer.class,customerId);  
  7.     printOrders(customer.getOrders());//使用getOrders獲取一個(gè)order對(duì)象set  
  8.     tx.commit();  
  9.   }catch (RuntimeException e) {  
  10.     if (tx != null) {  
  11.        tx.rollback();  
  12.     }  
  13.     throw e;  
  14.   } finally {  
  15.      session.close();  
  16.   }  

其調(diào)用的函數(shù)printOrders(Set orders)

  1. public void printOrders(Set orders){  
  2.      for (Iterator it = orders.iterator(); it.hasNext();) {  
  3.         Order order=(Order)it.next();  
  4.         System.out.println("OrderNumber of "+order.getCustomer().getName()+ " :"+order.getOrderNumber());  
  5.      }  
  6.  } 

(3)saveCustomerAndOrderWithInverse()方法:演示映射文件<set>屬性為inverse

  1. public void saveCustomerAndOrderWithInverse(){  
  2.       saveCustomerAndOrderSeparately();  
  3.       associateCustomerAndOrder();  
  4.    } 

調(diào)用的函數(shù)saveCustomerAndOrderSeparately():即是分別存儲(chǔ),與saveCustomerAndOrderWithCascade()方法恰好相反。

  1. Customer customer=new Customer();  
  2. customer.setName("Jack");  
  3. Order order=new Order();  
  4. order.setOrderNumber("Jack_Order001");  
  5. session.save(customer);  
  6. session.save(order);&nbsp;  
  7. tx.commit();  
  8. idOfJack=customer.getId();  
  9. idOfJackOrder=order.getId(); 

為了使上述代碼正常執(zhí)行,需要確保Order.hbm.xml文件的<many-to-one>元素的not null取默認(rèn)值false,否則會(huì)出現(xiàn)異常;Hibernate會(huì)執(zhí)行如下

  1. insert into CUSTOMERS(ID,NAME) values(2,"Jack");  
  2. insert into ORDERS(ID,ORDER_NUMBER,CUSTOMER_ID) values(2,"Jack_Order001",null); 

調(diào)用的函數(shù)associateCustomerAndOrder():該方法加載由saveCustomerAndOrderSeparately()方法持久化Customer和Order對(duì)象,然后建立兩者之間的一對(duì)多的關(guān)系

  1. public void associateCustomerAndOrder(){  
  2.    Session session = sessionFactory.openSession();  
  3.    Transaction tx = null;  
  4.    try {  
  5.      tx = session.beginTransaction();  
  6.      /*加載持久化對(duì)象Customer、Order*/ 
  7.      Customer customer=(Customer)session.load(Customer.class,idOfJack);  
  8.      Order order=(Order)session.load(Order.class,idOfJackOrder);  
  9.      /*建立Customer和Order的關(guān)聯(lián)關(guān)系*/ 
  10.      order.setCustomer(customer);  
  11.      customer.getOrders().add(order);  
  12.      tx.commit();  
  13.    }catch (RuntimeException e) {  
  14.      if (tx != null) {  
  15.        tx.rollback();  
  16.      }  
  17.       e.printStackTrace();  
  18.    } finally {  
  19.      session.close();  
  20.    }  
  21.  } 

這樣重復(fù)執(zhí)行多余的SQL語(yǔ)句會(huì)影響java應(yīng)用的性能,解決的方法是將<set>的inverse屬性設(shè)為true。因此修改Customer.hbm.xml文件:

  1. <set   
  2.         name="orders" 
  3.         inverse="true" 
  4.         cascade="save-update"   
  5.         >  
  6.           
  7.         <key column="CUSTOMER_ID" />//表示ORDERS表通過(guò)外鍵CUSTOMER_ID參照CUSTOMERS表  
  8.         <one-to-many class="mypack.Order" />  
  9. </set>  

(4)級(jí)聯(lián)刪除:

  1. tx = session.beginTransaction();  
  2.       Customer customer=(Customer)session.load(Customer.class,customerId);  
  3.       session.delete(customer);  
  4.       tx.commit(); 

如果要?jiǎng)h除Customer所關(guān)聯(lián)的Order對(duì)象的話(huà),需要將cascade屬性設(shè)置為delete,如下:

  1. <set   
  2.        name="orders" 
  3.        inverse="true" 
  4.        cascade="delete"   
  5.        >  
  6. <key column="CUSTOMER_ID" />  
  7.        <one-to-many class="mypack.Order" />  
  8.     </set> 

執(zhí)行后,Hibernate會(huì)做以下動(dòng)作:

  1. delete from ORDERS where CUSTOMER_ID=2;  
  2. delete from CUSTOMERS where ID=2

如果關(guān)聯(lián)雙方是父子關(guān)系,就可以把復(fù)方的cascade設(shè)置為all-delete-orphan;這樣刪除父方對(duì)象時(shí)就會(huì)級(jí)聯(lián)刪除所有關(guān)聯(lián)的子方對(duì)象。

#p#

三、映射一對(duì)多雙向自身關(guān)聯(lián)關(guān) 

Category.java:

  1. package mypack;  
  2. import java.util.HashSet;  
  3. import java.util.Set;  
  4. public class Category  implements java.io.Serializable {  
  5.      private long id;  
  6.      private String name;  
  7.      private Set childCategories = new HashSet(0);  
  8.      private Category parentCategory;  
  9.  
  10.     public Category() {  
  11.     }  
  12.  
  13.     public Category(String name, Set childCategories, Category parentCategory) {  
  14.        this.name = name;  
  15.        this.childCategories = childCategories;  
  16.        this.parentCategory = parentCategory;  
  17.     }  
  18.      
  19.     public long getId() {  
  20.         return this.id;  
  21.     }  
  22.       
  23.     public void setId(long id) {  
  24.         this.id = id;  
  25.     }  
  26.     public String getName() {  
  27.         return this.name;  
  28.     }  
  29.       
  30.     public void setName(String name) {  
  31.         this.name = name;  
  32.     }  
  33.     public Set getChildCategories() {  
  34.         return this.childCategories;  
  35.     }  
  36.       
  37.     public void setChildCategories(Set childCategories) {  
  38.         this.childCategories = childCategories;  
  39.     }  
  40.     public Category getParentCategory() {  
  41.         return this.parentCategory;  
  42.     }  
  43.       
  44.     public void setParentCategory(Category parentCategory) {  
  45.         this.parentCategory = parentCategory;  
  46.     }  

配置文件Category.hbm.xml:

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping  
  3. PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping >  
  6.  
  7.   <class name="mypack.Category" table="CATEGORIES" >  
  8.     <id name="id" type="long" column="ID">  
  9.       <generator class="increment"/>  
  10.     </id>  
  11.  
  12.     <property name="name" type="string" >  
  13.         <column name="NAME" length="15" />  
  14.     </property>  
  15.  
  16.     <set   
  17.         name="childCategories" 
  18.         cascade="save-update" 
  19.         inverse="true" 
  20.         >  
  21.         <key column="CATEGORY_ID" />  
  22.         <one-to-many class="mypack.Category" />  
  23.      </set>     
  24.  
  25.    <many-to-one  
  26.         name="parentCategory" 
  27.         column="CATEGORY_ID" 
  28.         class="mypack.Category" 
  29.        />  
  30.  
  31.   </class>  
  32.  
  33. </hibernate-mapping> 

原文鏈接:http://blog.csdn.net/yu422560654/article/details/7176407

【編輯推薦】

  1. 精通Hibernate:對(duì)象關(guān)系映射基礎(chǔ)
  2. 精通Hibernate:第一個(gè)Hibernate應(yīng)用
  3. Hibernate緩存何時(shí)使用和如何使用
  4. Hibernate連接Mysql中文亂碼處理
  5. Hibernate配置要點(diǎn)詳談
責(zé)任編輯:林師授 來(lái)源: yu422560654的博客
相關(guān)推薦

2009-06-04 10:34:19

Hibernate一對(duì)一對(duì)多關(guān)系配置

2009-06-18 14:22:06

Hibernate多對(duì)Hibernate

2012-03-21 11:43:41

JavaHibernate

2009-09-25 12:59:52

Hibernate映射

2012-02-08 12:17:38

HibernateJava

2009-06-03 16:27:27

Hibernate一對(duì)一關(guān)系

2009-06-03 16:18:16

Hibernate關(guān)系代碼實(shí)例

2009-06-04 16:14:22

Hibernate一對(duì)Hibernate一對(duì)Hibernate多對(duì)

2009-09-23 10:37:50

Hibernate一對(duì)

2009-09-23 10:57:02

Hibernate一對(duì)

2009-09-22 09:55:58

Hibernate實(shí)例

2023-06-12 08:09:01

FlaskSQLAlchemy

2012-02-03 10:54:50

HibernateJava

2009-07-21 17:31:39

iBATIS一對(duì)多映射

2009-09-23 13:26:10

Hibernate對(duì)象

2012-02-08 14:01:18

HibernateJava

2009-09-25 15:34:42

Hibernate關(guān)聯(lián)

2009-06-02 14:46:26

Hibernate關(guān)系映射教程

2010-04-15 09:09:02

Hibernate

2009-08-17 10:34:51

NHibernate一
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 天堂成人av | 国产日韩精品一区二区三区 | 日韩图区 | 伊人网站在线 | 亚洲看片 | 99精品视频在线观看 | www性色| 中文字幕一区二区三区不卡 | 欧美日韩高清在线观看 | 亚洲国产精品一区二区三区 | 久草在线青青草 | 日本人做爰大片免费观看一老师 | 免费黄色在线观看 | 欧美伊人| 成年男女免费视频网站 | 狠狠操狠狠干 | 中文字幕在线一区二区三区 | 国产www成人 | 欧美国产精品一区二区三区 | 一区二区三区视频免费观看 | 另类视频区 | 国产区精品视频 | 日本免费一区二区三区 | 男女视频网站 | 一区二区三区在线免费观看 | 日韩精品在线一区 | 色啪网 | 视频三区 | 久草在线 | www.国产 | 欧美成人一区二免费视频软件 | 久久久久国产精品免费免费搜索 | 国产一区二区在线免费观看 | 久久久久久国产 | 免费影视在线观看 | 国产精品国产成人国产三级 | 欧美精品乱码99久久影院 | 国产精品美女一区二区三区 | 羞羞视频在线观看免费观看 | 欧美福利久久 | 激情久久久久 |