精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

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

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

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

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

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

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

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類的所有屬性都是和CUSTOMERS表中的字段一一對應(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類的orderNumber屬性和ORDERS表中ORDER_NUMBER字段對應(yīng),映射代碼和上面類似,此處省去。我們關(guān)注的主要地方是,Order類中的customer屬性,因?yàn)樗荂ustomer類型的,是與ORDERS表的外鍵CUSTOMER_ID對應(yīng)的,它的真實(shí)值是存在CUSTOMERS表中而ORDERS表存的只是對它的引用,因此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持久化對象  
  65.       //不保存customer對象,這樣執(zhí)行的話會(huì)出現(xiàn)異常  
  66.       Order order1=new Order("Jack_Order001",customer);  
  67.       Order order2=new Order("Jack_Order002",customer);//創(chuàng)建兩個(gè)Order對象  
  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持久化對象  
  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對象  
  95.       session.save(order1);  
  96.       session.save(order2);  
  97.      // 對同一個(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()如果沒有session.save(customer)這一句,

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

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

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

疑問假設(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í)行的話,能夠成功的向ORDERS表中插入兩條數(shù)據(jù);但是當(dāng)Hibernate自動(dòng)清理(flush)緩存中所有持久化對象時(shí),又會(huì)拋出新的異常

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

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

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

  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”,表明保存或更新對象時(shí),會(huì)級聯(lián)保存或更新與它所關(guān)聯(lián)的對象。如上例中,執(zhí)行saveCustomerAndOrderWithCascade()時(shí),Hibernate會(huì)把order1與customer對象一起持久化,此時(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#

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

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

  1. Customer customer=order.getCustomer(); 

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

  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ì)給編程帶來影響。我們可以為Customer類和Order類簡歷一對多的雙向關(guān)聯(lián)。

第一部分我們已經(jīng)建立了Order類和Customer類的多對一關(guān)聯(lián),現(xiàn)在我們再增加Customer到Order類的一對多關(guān)聯(lián)。

Customer.java文件:

  1. package mypack;  
  2. import java.util.HashSet;  
  3.  
  4. import java.util.Set;  
  5. //Hibernate要求在持久化類中定義集合類屬性時(shí),必須要把屬性聲明為接口類型。  
  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)類,這樣做可以提高程序的健壯性,同時(shí)避免了應(yīng)用程序訪問取詞為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訪問方法  
  19.     public Set getOrders() {  
  20.         return this.orders;  
  21.     }  
  22.       
  23.     public void setOrders(Set orders) {  
  24.         this.orders = orders;  
  25.     }  

接下來就是映射文件的配置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表通過外鍵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對象時(shí)也會(huì)自動(dòng)持久化其所關(guān)聯(lián)的Order對象

  1.   public void saveCustomerAndOrderWithCascade(){  
  2.     Session session = sessionFactory.openSession();  
  3.     Transaction tx = null;  
  4.     try {  
  5.       tx = session.beginTransaction();  
  6. /*創(chuàng)建一個(gè)customer對象和order對象*/ 
  7.       Customer customer=new Customer("Tom",new HashSet());  
  8.       Order order=new Order();  
  9.       order.setOrderNumber("Tom_Order001");  
  10. /*建立Customer與Order的一對多雙向關(guān)聯(lián)關(guān)系*/ 
  11.       order.setCustomer(customer);  
  12.       customer.getOrders().add(order);  
  13. /*保存Customer對象*/ 
  14.       session.save(customer);  
  15. /* 當(dāng)映射文件中<set>的屬性為“save-update”時(shí),Hibernate在持久化Customer對象時(shí)也會(huì)自動(dòng)持久化其所關(guān)聯(lián)的Order對象  
  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對象時(shí)也會(huì)自動(dòng)持久化其所關(guān)聯(lián)的Order對象

  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對象

  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對象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對象,然后建立兩者之間的一對多的關(guān)系

  1. public void associateCustomerAndOrder(){  
  2.    Session session = sessionFactory.openSession();  
  3.    Transaction tx = null;  
  4.    try {  
  5.      tx = session.beginTransaction();  
  6.      /*加載持久化對象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語句會(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表通過外鍵CUSTOMER_ID參照CUSTOMERS表  
  8.         <one-to-many class="mypack.Order" />  
  9. </set>  

(4)級聯(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對象的話,需要將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;這樣刪除父方對象時(shí)就會(huì)級聯(lián)刪除所有關(guān)聯(lián)的子方對象。

#p#

三、映射一對多雙向自身關(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:對象關(guān)系映射基礎(chǔ)
  2. 精通Hibernate:第一個(gè)Hibernate應(yīng)用
  3. Hibernate緩存何時(shí)使用和如何使用
  4. Hibernate連接Mysql中文亂碼處理
  5. Hibernate配置要點(diǎn)詳談
責(zé)任編輯:林師授 來源: yu422560654的博客
相關(guān)推薦

2009-06-04 10:34:19

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

2009-06-18 14:22:06

Hibernate多對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一對一關(guān)系

2009-06-03 16:18:16

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

2009-06-04 16:14:22

Hibernate一對Hibernate一對Hibernate多對

2009-09-23 10:37:50

Hibernate一對

2009-09-23 10:57:02

Hibernate一對

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一對多映射

2009-09-23 13:26:10

Hibernate對象

2012-02-08 14:01:18

HibernateJava

2009-06-02 14:46:26

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

2009-09-25 15:34:42

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

2010-04-15 09:09:02

Hibernate

2009-08-17 10:34:51

NHibernate一
點(diǎn)贊
收藏

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

黄色a级片免费看| 国产自摸综合网| 亚洲天堂2024| 免费在线观看一区| 亚洲三级在线观看| 精品在线不卡| 96亚洲精品久久久蜜桃| 自产国语精品视频| 亚洲嫩模很污视频| 26uuu国产| 怡红院成人在线| 亚洲精品国产第一综合99久久| 欧美日韩国产精品一区二区| 国产免费一区二区三区最新不卡| 亚洲欧美日韩一区在线观看| 久久久国产精品亚洲一区| 黄色国产在线观看| 久久丁香四色| 在线免费av一区| 欧美精品一区二区三区三州| 日本电影在线观看网站| 99热在这里有精品免费| 成人久久一区二区三区| 日本免费精品视频| 极品日韩av| 美日韩精品免费视频| 天天干天天舔天天操| 嫩草国产精品入口| 日韩视频免费观看高清完整版在线观看| 日韩亚洲在线视频| 蜜桃视频动漫在线播放| 一区二区三区在线免费| 资源网第一页久久久| 青青草观看免费视频在线| 国产盗摄女厕一区二区三区| 国产日本欧美一区二区三区在线| 国产精品久久久久久99| 国产一区亚洲| 欧美精品一本久久男人的天堂| 日本在线观看网址| 日韩不卡一区| 国产亚洲激情在线| 欧美做受xxxxxⅹ性视频| 狼人精品一区二区三区在线 | 欧美日韩一区二区三区视频播放| 亚洲精品久久久久中文字幕欢迎你| 日本特黄在线观看| 在线不卡一区| 在线播放一区二区三区| 羞羞的视频在线| 欧美成人免费全部网站| 欧美日韩中文精品| 91丨九色丨蝌蚪| 3d动漫一区二区三区在线观看| 欧美日韩视频第一区| 嫩草影院国产精品| 日本午夜精品久久久久| 欧美日韩aaa| 国产女同无遮挡互慰高潮91| 久久久久久亚洲精品美女| 欧美剧情片在线观看| 国产又粗又长又爽又黄的视频| 欧美日韩免费电影| 欧美一区二区三区色| 又黄又爽又色的视频| 一区二区中文字幕在线观看| 亚洲国产97在线精品一区| 少妇被狂c下部羞羞漫画| 青青久久av| 亚洲片在线资源| 岛国片在线免费观看| 小处雏高清一区二区三区| 欧美精品在线网站| 国产污视频在线看| 老司机一区二区三区| 国产精品老牛影院在线观看| 亚洲精品国产福利| 日本性生活一级片| 亚洲综合图色| 色噜噜狠狠色综合网图区| 欧美老熟妇一区二区三区| 欧美三级网页| 国产va免费精品高清在线观看| 中文字幕欧美色图| 国产成人免费视频网站高清观看视频 | 亚洲制服欧美久久| 青春草在线视频| 欧美性生活大片免费观看网址| 在线免费视频a| 精品麻豆剧传媒av国产九九九| 亚洲国产精品免费| 国产馆在线观看| 尤物在线精品| 国产精品中文字幕在线观看| 亚洲精品久久久久久动漫器材一区| 91在线精品一区二区| 亚洲一区二区在线观| www.8ⅹ8ⅹ羞羞漫画在线看| 在线观看av一区| 韩国三级hd中文字幕有哪些| 国产一卡不卡| 精品中文字幕在线观看| 天天操夜夜操视频| 国产一区二区三区精品视频| 久久久久久国产精品mv| 成人福利网站| 91久久精品一区二区三区| 日韩精品xxx| japanese国产精品| 国外成人在线播放| 88av在线视频| 久久天堂av综合合色蜜桃网| 国产91porn| 欧美一级大片| 亚洲国产精品字幕| 一区二区成人免费视频| 日韩1区2区3区| 精品日本一区二区三区在线观看 | 91超碰中文字幕久久精品| 国产精品一二三四五区| 久久久久久久免费视频了| 国产天堂视频在线观看| 亚洲精品毛片| 国产亚洲精品美女久久久| 日韩精品一区二区三| 国精产品一区一区三区mba视频| 欧美一级日本a级v片| 国内激情视频在线观看| 精品久久久网站| 一级片一级片一级片| 蜜桃一区二区三区四区| 日韩精品电影网站| 成人欧美大片| 亚洲精品视频久久| www.毛片.com| 91影院在线观看| 少妇人妻在线视频| 久久午夜影院| 97国产精品视频| 免费看日韩av| 亚洲第一成人在线| 成年人小视频在线观看| 欧美日韩国产在线一区| 亚洲综合中文字幕在线| 高h视频在线观看| 日韩三级免费观看| 国产精品白嫩白嫩大学美女| 国产一二三精品| 欧美大片免费播放| 亚洲日本va中文字幕| 九九热精品视频在线播放| av网站免费大全| 综合久久久久久久| 中文字幕55页| 亚洲婷婷免费| 九九九九精品九九九九| 欧美sm一区| 亚洲天堂av电影| 国产亚洲久一区二区| 中文字幕中文字幕一区二区| 久国产精品视频| 欧美日韩一区二区国产| 国产精品swag| 欧美一级鲁丝片| 国产一区二区三区四区福利| 在线观看国产区| 综合电影一区二区三区| 黑人无套内谢中国美女| 国产亚洲一区在线| 视频在线精品一区| 激情久久免费视频| 韩国19禁主播vip福利视频| 少妇精品高潮欲妇又嫩中文字幕 | 在线视频欧美亚洲| 亚洲欧美一区二区久久| 亚洲一区二区三区四区av| 国产毛片久久| 一区二区三区四区| 91久久精品无嫩草影院| 欧美在线激情网| 天堂地址在线www| 欧美成人猛片aaaaaaa| 国产又爽又黄的视频| 国产日韩欧美亚洲| 91精品人妻一区二区三区蜜桃2| 一本色道久久综合亚洲精品不卡| 欧美日韩在线精品一区二区三区| 香蕉久久一区| 9.1国产丝袜在线观看| 性开放的欧美大片| 亚洲精品国产欧美| 一级二级三级视频| 亚洲va国产天堂va久久en| 国产1区2区在线观看| 国产99精品在线观看| 日韩福利视频在线| 欧美视频在线观看| 日产精品一线二线三线芒果| 一区二区三区四区视频免费观看 | 精品精品精品| 国产女精品视频网站免费| 超清av在线| 久久精品国产亚洲精品2020| 日韩一二三四| 精品日韩在线观看| 中文字幕+乱码+中文乱码www| 亚洲一二三四久久| 欧美性生交大片| 26uuu国产电影一区二区| 无套内谢丰满少妇中文字幕 | 国产精品直播网红| 午夜久久中文| 欧美激情视频免费观看| 日本在线观看| 亚洲欧美日韩一区二区在线 | 久久精品视频一区| 亚洲免费观看在线| 激情久久五月天| 中文字幕第80页| 久久都是精品| 欧美一区二区中文字幕| 中文字幕亚洲精品乱码| 亚洲免费视频一区| 九九亚洲精品| 久久亚洲高清| 日本欧美韩国国产| 国语精品免费视频| 99国产精品免费网站| 成人精品一区二区三区电影免费 | 中文字幕中文字幕在线中一区高清| 免费毛片在线不卡| 久久精品日产第一区二区三区精品版 | 女海盗2成人h版中文字幕| 欧美精品日韩三级| 国产原创精品视频| xxxxxxxxx欧美| 日p在线观看| y97精品国产97久久久久久| 二区三区在线播放| 国产一区二区三区在线免费观看| 日本成人一区二区三区| 亚洲国产精品免费| 五月婷婷在线播放| 精品亚洲国产成av人片传媒| 无码国产精品96久久久久| 亚洲福利在线观看| 全部免费毛片在线播放一个| 精品福利一区二区三区| 黄色片一区二区三区| 欧美v国产在线一区二区三区| 亚洲大尺度网站| 亚洲第一综合天堂另类专| 日本国产在线观看| 日韩电影在线观看中文字幕 | 2023国产精华国产精品| 高清视频一区二区三区| 麻豆一区二区| 欧洲精品一区色| 三级电影一区| 亚洲色婷婷久久精品av蜜桃| 黄色日韩在线| 人妻有码中文字幕| 免费成人在线影院| 中文字幕第10页| 成人激情午夜影院| 国产熟妇搡bbbb搡bbbb| 国产女人aaa级久久久级| 久久午夜精品视频| 《视频一区视频二区| 久久久美女视频| 欧美性色19p| 91成人国产综合久久精品| 日韩天堂在线观看| 深夜福利在线观看直播| 一个人www欧美| av在线播放观看| 91av在线精品| 欧美亚洲福利| 国产视频精品网| 超碰成人久久| 亚洲熟妇无码av在线播放| 午夜亚洲激情| 亚洲综合在线一区二区| 99精品欧美一区二区三区小说| 久操视频在线观看免费| 亚洲综合成人在线| 国产女主播喷水视频在线观看 | 黄色成人av在线| 一二三区免费视频| 欧美一级二级三级乱码| 神马亚洲视频| 欧美大片免费看| 在线播放高清视频www| 国产精品亚洲美女av网站| av最新在线| 青青精品视频播放| 国模私拍国内精品国内av| 岛国一区二区三区高清视频| 精品国产91乱码一区二区三区四区| 黄色a级在线观看| 久久成人免费| 国产精品熟妇一区二区三区四区 | 中文字幕一区二区三区精彩视频| 亚洲日韩视频| 日本高清一区二区视频| 久久伊99综合婷婷久久伊| 五月天丁香激情| 欧美视频一二三区| 日韩欧美亚洲系列| 欧美精品在线免费| 欧美jizz18| 色噜噜狠狠一区二区三区| 最新成人av网站| 久久综合桃花网| 国产精品色婷婷久久58| 91精品国产综合久久久蜜臀九色 | 欧美激情一区二区三区p站| 国产精品久久网站| 黄色网址中文字幕| 精品视频www| 成人免费网站观看| 3d动漫啪啪精品一区二区免费| 日韩精品免费| 日韩亚洲在线视频| 久久新电视剧免费观看| 日本道在线观看| 精品久久久久久久久久久久包黑料| 黄色网址在线免费| 国产在线高清精品| 日韩精品永久网址| 国产精品视频黄色| 国产欧美一区在线| 欧美brazzers| 国产一区二区日韩| 电影亚洲一区| 亚洲午夜精品国产| 日韩精品视频网| 日本乱子伦xxxx| 欧美这里有精品| av资源在线观看免费高清| 国产精品免费在线免费| 欧美亚洲国产一区| 性刺激的欧美三级视频| 国产精品视频一二三| 波多野结衣高清视频| 中文亚洲视频在线| 欧美黄页免费| 在线观看一区二区三区三州| 精品制服美女丁香| 91高清免费看| 精品国产免费人成在线观看| xxx.xxx欧美| 久久99国产精品| 亚洲一区一卡| 午夜精产品一区二区在线观看的| 在线精品观看国产| 日本在线人成| 99精品99久久久久久宅男| 精久久久久久| 久久精品国产亚洲av麻豆| 欧美自拍偷拍一区| 黄色网在线免费观看| 波多野结衣一区二区三区在线观看| 伊人蜜桃色噜噜激情综合| 国产中文字幕一区二区| 色婷婷激情综合| 丝袜制服一区二区三区| 高清一区二区三区av| 日韩精品一区二区三区丰满| 久久99在线观看| 久久精品第一页| 亚洲免费一在线| 视频欧美精品| 国产精品久久久久7777| 久久久国产一区二区三区四区小说 | 催眠调教后宫乱淫校园| 精品久久久久久久久中文字幕 | 国产黄色一区二区| 91国自产精品中文字幕亚洲| 国产精品美女久久久久久不卡| 国产aⅴ爽av久久久久| 一二三四区精品视频| 邻居大乳一区二区三区| 成人性生交xxxxx网站| 欧美成人日韩| brazzers精品成人一区| 欧美放荡的少妇| 色在线中文字幕| 黄色a级在线观看| 久久综合九色综合97_久久久| 亚洲影视一区二区| 国内精品视频一区| 成人在线一区| 国产伦精品一区二区三区88av| 欧美性猛交xxxx黑人交| 国产精品69xx| 中文字幕在线亚洲精品| 91麻豆.com| 亚洲精品一级片| 国产欧美日韩综合精品|