POJOs以下:html
Customer類---->customer表數據庫
Order類對應---->orders表數組
customer(1)<----->(n)ordersession
- public class Customer
- {
- private String id;
- private String username;
- private String password;
- private Timestamp registerTime;
- private int age;
- private Set<Order> orders = new HashSet<Order>();
-
- /*setter and getter method*/
- }
- public class Order
- {
- private String id;
- private String orderNumber;
- private int balance;
- private Customer customer;
-
- /*setter and getter method*/
- }
Set集合映射:app
Hibernate爲集合映射提供了專用的標籤元素,Set集合映射,就使用<set>標籤表示:性能
- <?xml version="1.0" encoding="utf-8"?>
- <!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.suxiaolei.hibernate.pojos.Customer" table="customer">
- <!-- 主鍵設置 -->
- <id name="id" type="string">
- <column name="id"></column>
- <generator class="uuid"></generator>
- </id>
-
- <!-- 屬性設置 -->
- <property name="username" column="username" type="string"></property>
- <property name="password" column="password" type="string"></property>
- <property name="age" column="age" type="integer"></property>
- <property name="registerTime" column="register_time" type="timestamp"></property>
-
- <set name="orders" inverse="true" cascade="all">
- <key column="customer_id"></key>
- <one-to-many class="com.suxiaolei.hibernate.pojos.Order"/>
- </set>
-
- </class>
- </hibernate-mapping>
<set>標籤中的"name"屬性表示customer對象中關係集合的屬性名,"inverse"與"cascade"屬性說明 (參考這裏)。在數據庫中表示"一對多"的關係是經過外鍵關聯的方式實現的,"多方"經過持有"一方"的主鍵值來肯定關係,怎麼持有"一方"的主鍵值?" 多方"將使用一列來存儲"一方"的主鍵值,而後將此列做爲外鍵列參照"一方"的主鍵列。因此使用Hibernate開發時須要將兩表的關係列(外鍵列)告 訴Hibernate,<key column="customer_id"></key>就是完成這個工做的,Hibernate就能根據 "customer_id"列取出關聯信息。例如:從customer表中取出一條記錄後,Hibernate會根據該customer記錄的主鍵值再從 order表中查找"custom_id"列,取出值相等的記錄,而後組裝到Customer對象中的set集合屬性中,反之亦然。由於取出來的記錄(只 是一些零碎的值,尚未組裝成對象)須要存放到Set集合中,因此要告訴Hibernate在Set集合裏面能放什麼類型的數據。<one-to- many>這個標籤就是完成這個工做的,"class"屬性是指定這個這個Set集合裏面元素的類型。測試
- <?xml version="1.0" encoding="utf-8"?>
- <!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.suxiaolei.hibernate.pojos.Order" table="orders">
- <id name="id" type="string">
- <column name="id"></column>
- <generator class="uuid"></generator>
- </id>
-
- <property name="orderNumber" column="orderNumber" type="string"></property>
- <property name="balance" column="balance" type="integer"></property>
-
- <many-to-one name="customer" class="com.suxiaolei.hibernate.pojos.Customer">
- <column name="customer_id"></column>
- </many-to-one>
- </class>
- </hibernate-mapping>
<many-to-one>標籤是設置"一對多"關係中的"多方"的,name指定了哪個屬性是關係屬性,"class"指定了關係 屬性的類型(也指定了與哪個表關聯), "column"屬性是指定這個關聯屬性是按照"customer_id"列的值,在customer表中查詢得到的。ui
測試:.net
- tx = session.beginTransaction();
-
- /*
- * 建立Customer對象,並設置其屬性值
- */
- Customer customer = new Customer();
- customer.setUsername("zhangsan");
- customer.setPassword("123456");
- customer.setAge(22);
- customer.setRegisterTime(new Timestamp(new Date().getTime()));
-
- /*
- * 建立Order對象order1,並設置其屬性值
- */
- Order order1 = new Order();
- order1.setOrderNumber("a1a2a3");
- order1.setBalance(1000);
- order1.setCustomer(customer);
-
- /*
- * 建立Order對象order2,並設置其屬性值
- */
- Order order2 = new Order();
- order2.setOrderNumber("d3d2d1");
- order2.setBalance(670);
- order2.setCustomer(customer);
-
- customer.getOrders().add(order1);
- customer.getOrders().add(order2);
-
- session.saveOrUpdate(customer);
-
- tx.commit();
查看數據庫的數據:hibernate
customer表:
orders表
能夠看到數據被成功的插入到數據庫中了,而且"custom_id"列(關係列)也正確賦值了。
List映射:
Hibernate爲集合映射提供了專用的標籤元素,List集合映射,就使用<list>標籤表示:
- <list name="orders" inverse="false" cascade="all">
- <key column="customer_id"></key>
- <index column="customer_index" type="integer"></index>
- <one-to-many class="com.suxiaolei.hibernate.pojos.Order"/>
- </list>
List集合是有順序的,"index"標籤,是用於記錄順序,List的順序將表如今"customer_index"列上,其他設置,與Set 集合相似。注意:List映射中"inverse"中的值不能設置爲"true",由於List集合的順序只有customer方知道,order方不知 道List的存在。否則,"customer_index"的列值將不會被賦值。
查看數據庫:
customer表:
orders表:
能夠看到記錄正確的插入到數據庫中了,並且"custom_index"正確的表示出List的順序。
Array(數組)映射:標籤使用<array>其餘與List基本一致。
Map映射:
Hibernate爲集合映射提供了專用的標籤元素,Map集合映射,就使用<map>標籤表示:
- <map name="orders" inverse="false" cascade="all">
- <key column="customer_id"></key>
- <index column="order_key" type="string"></index>
- <one-to-many class="com.suxiaolei.hibernate.pojos.Order"/>
- </map>
Map映射中<index>標籤,表示Map集合中的key值,記錄在"order_key"列中,<one-to- many>表示Map集合中的vlaue。其餘設置與上面同樣。注意:"inverse"不要設置成"true"由於key值是customer對 象維護的,而order不知道key的存在。
Bag映射:它是List與Set集合的結合,能夠重複,可是無順。使用List模擬Bag。設置相似Set,它也有專用標籤<bag>。
總 結
在沒有特殊要求下,最好使用Set集合,由於Set集合沒有特殊信息須要"一方"本身維護,能夠徹底交給"多方"維護,可以提升性能,若須要記錄數 據的順序可使用List和Array映射,若須要key/value形式存儲數據,可使用Map映射。最後一點若集合放置的數據簡單類型(原生類型、 原生類型的包裝類、String、Date之類的)在集合映射配置上稍有不一樣,<element>元素能夠直接映射這些簡單類型,其餘配置與 上述配置沒什麼不一樣。
原文連接:http://www.cnblogs.com/otomedaybreak/archive/2012/01/18/2325993.html