日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Hibernate之对象关系映射

發布時間:2025/3/20 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate之对象关系映射 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、一對多關聯關系

1.單向n-1

  • 單向n-1關聯只需從n的一端可以訪問1的一端

  • Hibernate使用<many-to-one>元素來映射多對一關聯關系

<!-- 映射多對一的關聯關系。 使用 many-to-one 來映射多對一的關聯關系 name: 多這一端關聯的一那一端的屬性的名字class: 一那一端的屬性對應的類名column: 一那一端在多的一端對應的數據表中的外鍵的名字 --> ? <many-to-one name="" class="" column=""/>
  • 實例:

Customer.java

public class Customer { ?private Integer customerId;private String customerName; }

Order.java

public class Order {private Integer orderId;private String orderName; }

Customer.hbm.xml

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> ? <hibernate-mapping><class name="com.yfy.hibernate.entity.n21.Customer" table="CUSTOMERS"><id name="customerId" type="java.lang.Integer"><column name="CUSTOMER_ID" /><generator class="native" /></id><property name="customerName" type="java.lang.String"><column name="CUSTOMER_NAME" /></property></class></hibernate-mapping>

Order.hbm.xml

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> ? <hibernate-mapping package="com.yfy.hibernate.entity.n21"> ?<class name="Order" table="ORDERS"> ?<id name="orderId" type="java.lang.Integer"><column name="ORDER_ID" /><generator class="native" /></id><property name="orderName" type="java.lang.String"><column name="ORDER_NAME" /></property><many-to-one name="customer" class="Customer" column="CUSTOMER_ID"></many-to-one> ?</class> </hibernate-mapping>

HibernateTest.java

public class HibernateTest { ?private SessionFactory sessionFactory;private Session session;private Transaction transaction;@Beforepublic void init(){Configuration configuration = new Configuration().configure();ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();sessionFactory = configuration.buildSessionFactory(serviceRegistry);session = sessionFactory.openSession();transaction = session.beginTransaction();}@Afterpublic void destroy(){transaction.commit();session.close();sessionFactory.close();} ? ?@Testpublic void testDelete(){//在不設定級聯關系的情況下, 且 1 這一端的對象有 n 的對象在引用, 不能直接刪除 1 這一端的對象Customer customer = (Customer) session.get(Customer.class, 1);session.delete(customer); }@Testpublic void testUpdate(){Order order = (Order) session.get(Order.class, 1);order.getCustomer().setCustomerName("AAA");}@Testpublic void testMany2OneGet(){//1. 若查詢多的一端的一個對象, 則默認情況下, 只查詢了多的一端的對象. 而沒有查詢關聯的//1 的那一端的對象!Order order = (Order) session.get(Order.class, 1);System.out.println(order.getOrderName()); System.out.println(order.getCustomer().getClass().getName()); ?session.close(); ?//2. 在需要使用到關聯的對象時, 才發送對應的 SQL 語句.Customer customer = order.getCustomer();System.out.println(customer.getCustomerName()); ?//3. 在查詢 Customer 對象時, 由多的一端導航到 1 的一端時,//若此時 session 已被關閉, 則默認情況下//會發生 LazyInitializationException 異常//4. 獲取 Order 對象時, 默認情況下, 其關聯的 Customer 對象是一個代理對象!}@Testpublic void testMany2OneSave(){Customer customer = new Customer();customer.setCustomerName("BB");Order order1 = new Order();order1.setOrderName("ORDER-3");Order order2 = new Order();order2.setOrderName("ORDER-4");//設定關聯關系order1.setCustomer(customer);order2.setCustomer(customer);//執行 save 操作: 先插入 Customer, 再插入 Order, 3 條 INSERT//先插入 1 的一端, 再插入 n 的一端, 只有 INSERT 語句. // session.save(customer); // // session.save(order1); // session.save(order2);//先插入 Order, 再插入 Customer. 3 條 INSERT, 2 條 UPDATE//先插入 n 的一端, 再插入 1 的一端, 會多出 UPDATE 語句!//因為在插入多的一端時, 無法確定 1 的一端的外鍵值. 所以只能等 1 的一端插入后, 再額外發送 UPDATE 語句.//推薦先插入 1 的一端, 后插入 n 的一端 ?session.save(order1);session.save(order2); ?session.save(customer);} }

2.雙向1-n

  • 雙向1-n需要在1的一端可以訪問n的一端,反之亦然

  • Hibernate使用<set>元素來映射set類型的屬性

<set name="orders"><key column="customer_id"></key><one-to-many class="Order"/> </set>
  • 當Session從數據庫中加載Java集合時,創建的是Hibernate內置集合類的實例,因此在持久化類中定義集合屬性時必須把屬性聲明為Java接口類型

    • Hibernate的內置集合類具有集合代理功能,支持延遲檢索策略

  • 在定義集合屬性時,通常把它初始化為集合實現類的一個實例,這樣可以提高程序的健壯性,避免NullPointerException

  • 實例

Customer.java

public class Customer { ?private Integer customerId;private String customerName;/** 1. 聲明集合類型時, 需使用接口類型, 因為 hibernate 在獲取* 集合類型時, 返回的是 Hibernate 內置的集合類型, 而不是 JavaSE 一個標準的* 集合實現. * 2. 需要把集合進行初始化, 可以防止發生空指針異常*/private Set<Order> orders = new HashSet<>(); }

Order.java

public class Order {private Integer orderId;private String orderName;private Customer customer; }

Customer.hbm.xml

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> ? <hibernate-mapping package="com.yfy.hibernate.entity.n21"><class name="Customer" table="CUSTOMERS"><id name="customerId" type="java.lang.Integer"><column name="CUSTOMER_ID" /><generator class="native" /></id><property name="customerName" type="java.lang.String"><column name="CUSTOMER_NAME" /></property><!-- 映射 1 對多的那個集合屬性 --><!-- set: 映射 set 類型的屬性, table: set 中的元素對應的記錄放在哪一個數據表中. 該值需要和多對一的多的那個表的名字一致 --><!-- inverse: 指定由哪一方來維護關聯關系. 通常設置為 true, 以指定由多的一端來維護關聯關系 --><!-- cascade 設定級聯操作. 開發時不建議設定該屬性. 建議使用手工的方式來處理 --><!-- order-by 在查詢時對集合中的元素進行排序, order-by 中使用的是表的字段名, 而不是持久化類的屬性名 --><set name="orders" table="ORDERS" inverse="true" order-by="ORDER_NAME DESC"><!-- 執行多的表中的外鍵列的名字 --><key column="CUSTOMER_ID"></key><!-- 指定映射類型 --><one-to-many class="Order"/></set></class></hibernate-mapping>

其余同1對多的代碼。。。

二、多對多關聯關系

1.單向n-n

  • n-n的關聯必須使用連接表

  • 與1-n類似,必須為set集合元素添加key子元素,集合中的元素使用many-to-many

Category.java

public class Category { ?private Integer id;private String name;private Set<Item> items = new HashSet<>(); }

Item.java

public class Item { ?private Integer id;private String name;private Set<Category> categories = new HashSet<>(); }

Category.hbm.xml

? ? ? ?<!-- table: 指定中間表 --><set name="items" table="CATEGORIES_ITEMS"><key><column name="C_ID" /></key><!-- 使用 many-to-many 指定多對多的關聯關系. column 執行 Set 集合中的持久化類在中間表的外鍵列的名稱 --><many-to-many class="Item" column="I_ID"></many-to-many></set>

2.雙向n-n

  • 雙向n-n關聯需要兩端都使用集合屬性

  • 雙向n-n關聯必須使用連接表

  • 集合屬性增加key子元素映射外鍵列,many-to-many子元素關聯實體類

  • 對于雙向n-n關聯,必須把其中一端的inverse設置為true,否則兩端都維護關聯關系可能會造成主鍵沖突

Item.hbm.xml

?<set name="categories" table="CATEGORIES_ITEMS" inverse="true"><key column="I_ID"></key><many-to-many class="Category" column="C_ID"></many-to-many></set>

?

總結

以上是生活随笔為你收集整理的Hibernate之对象关系映射的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。