Hibernate之集合映射的使用(Set集合映射,list集合映射,Map集合映射)


a:數據庫的相關知識:

  (1):一個表能否有多個主鍵:不能;

  (2):為什么要設置主鍵:數據庫存儲的數據都是有效的,必須保持唯一性;

  (3)為什么id作為主鍵:因為表中通常找不到合適的列作為唯一列,即主鍵,所有為了方便用id列,因為id是數據庫系統維護可以保證唯一,所以就把這列作為主鍵,簡單的說為了方便;如果找不到合適的列,除了使用id列以為作為主鍵,也可以使用聯合主鍵,即多列的值作為一個主鍵,從而確保了記錄的唯一性,即為聯合主鍵;

Hibernate的映射很重要哦,如果是一般的映射,很容易掌握和使用,但是如果是集合映射呢,這里簡單使用一下集合映射;

1:第一步,作為使用別人框架的中國人,我們只能先引入別人的包咯,千萬別忘記了哦

2:第二步,就是配置hibernate.cfg.xml了,這里的配置之前已經說過了,分三大部分

  第一部分,數據庫連接配置。

  第二部分,其他相關配置。

    這里使用了自動創建數據表, <property name="hibernate.hbm2ddl.auto">update</property>

    下面的源碼詳細介紹了幾種方法的區別,如何找到hibernate.hbm2ddl.auto這句話呢,如下所示:

  第三部分,加載映射文件。

 1 <!DOCTYPE hibernate-configuration PUBLIC
 2     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 3     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 4 
 5 <hibernate-configuration>
 6     <!-- 一個session-factory節點代表一個數據庫 -->
 7     <session-factory>
 8         <!-- 第一部分:數據庫連接配置 -->
 9         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
10         <property name="hibernate.connection.url">jdbc:mysql:///test</property>
11         <property name="hibernate.connection.username">root</property>
12         <property name="hibernate.connection.password">123456</property>
13         
14         <!-- 第二部分:其他相關配置 -->
15         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
16         <property name="hibernate.show_sql">true</property>
17         <property name="hibernate.format_sql">true</property>
18         <property name="hibernate.hbm2ddl.auto">update</property>
19         <!-- 
20              1:每次在創建sessionFactory時執行創建表,當調用sessionFactory的close方法的時候,刪除表
21              #hibernate.hbm2ddl.auto create-drop
22             
23             2:每次都重新建表,如果已經存在就先刪除再創建
24             #hibernate.hbm2ddl.auto create
25             
26             3:如果表不存在就創建,表存在就不創建
27             #hibernate.hbm2ddl.auto update
28             
29             4:生成環境時候執行驗證,當映射文件的內容與數據庫表結構不一樣的時候就報錯
30             #hibernate.hbm2ddl.auto validate
31           --> 
32         
33         <!-- 第三部分,加載映射文件 -->
34         <mapping resource="com/bie/po/User.hbm.xml"/>
35         
36     </session-factory>
37 </hibernate-configuration>    
38     
39     
40     

3:第三步,創建實體類,我依次使用了set,list,map集合來完成映射,這里一下全都寫到了實體類里面了!!!

 1 package com.bie.po;
 2 
 3 import java.util.List;
 4 import java.util.Map;
 5 import java.util.Set;
 6 
 7 /** 
 8 * @author BieHongLi 
 9 * @version 創建時間:2017年3月15日 下午4:07:18 
10 * 實體類
11 */
12 public class User {
13 
14     private int id;
15     private String name;
16     //一個用戶,對應多個地址
17     private Set<String> address;
18     
19     private List<String> addressList;
20     
21     private Map<String, String> addressMap;
22     
23 
24     public Map<String, String> getAddressMap() {
25         return addressMap;
26     }
27     public void setAddressMap(Map<String, String> addressMap) {
28         this.addressMap = addressMap;
29     }
30     public List<String> getAddressList() {
31         return addressList;
32     }
33     public void setAddressList(List<String> addressList) {
34         this.addressList = addressList;
35     }
36     public int getId() {
37         return id;
38     }
39     public void setId(int id) {
40         this.id = id;
41     }
42     public String getName() {
43         return name;
44     }
45     public void setName(String name) {
46         this.name = name;
47     }
48     public Set<String> getAddress() {
49         return address;
50     }
51     public void setAddress(Set<String> address) {
52         this.address = address;
53     }
54     
55     
56     
57 }

4:創建好實體類,就可以進行映射配置了,如實體類名.hbm.xml

   (1)set集合屬性的映射:重點消化
           name指定要映射的set集合的屬性
           table集合屬性要映射的表
           key指定集合表(t_address)的外鍵字段
           element指定集合表的其他字段
           type元素類型,一定要指定

  (2)List集合屬性的映射
                name指定要映射的list集合的屬性
                table集合屬性要映射的表
                key指定集合表(t_addressList)的外鍵字段
                element指定集合表的其他字段
                type元素類型,一定要指定
                list-index是list集合一定要指定的,指定排序列的名稱,因為list是有序的

  (3) Map映射
                name指定要映射的map集合的屬性
                table集合屬性要映射的表
                key指定集合表(t_addressMap)的外鍵字段
                element指定集合map的其他字段value
                type元素類型,一定要指定
                map-key指定map的key

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC 
 3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5     
 6 <hibernate-mapping>
 7     <class name="com.bie.po.User" table="t_test">
 8         <!-- 主鍵映射 -->
 9         <id name="id" column="id">
10             <generator class="native"></generator>
11         </id>
12         <!-- 非主鍵映射 -->
13         <property name="name" column="name"></property>
14         
15         <!-- 
16             set集合屬性的映射:重點消化
17                 name指定要映射的set集合的屬性
18                 table集合屬性要映射的表
19                 key指定集合表(t_address)的外鍵字段
20                 element指定集合表的其他字段
21                 type元素類型,一定要指定
22          -->
23          <set name="address" table="t_address">
24              <key column="uid"></key>
25              <element column="address" type="string"></element>
26          </set>
27          
28          
29          <!-- 
30              List集合屬性的映射
31                  name指定要映射的list集合的屬性
32                 table集合屬性要映射的表
33                 key指定集合表(t_addressList)的外鍵字段
34                 element指定集合表的其他字段
35                 type元素類型,一定要指定
36                 list-index是list集合一定要指定的,指定排序列的名稱,因為list是有序的
37           -->
38           <list name="addressList" table="t_addressList">
39               <key column="uid"></key>
40               <list-index column="idx"></list-index>
41               <element column="address" type="string"></element>
42           </list>
43           
44           <!-- 
45                 Map映射
46                     name指定要映射的map集合的屬性
47                 table集合屬性要映射的表
48                 key指定集合表(t_addressMap)的外鍵字段
49                 element指定集合map的其他字段value
50                 type元素類型,一定要指定
51                 map-key指定map的key
52            -->
53           <map name="addressMap" table="t_addressMap">
54               <key column="uid"></key>
55               <map-key type="string" column="shortName"></map-key>
56               <element type="string" column="address"></element>
57           </map>
58           
59           
60     </class>
61 </hibernate-mapping>    

5:映射配置好之后呢,就可以開始進行測試了,這里使用junit進行測試哦~~~

  這里需要注意的是最后一個測試獲取數據的時候,

  只有當使用集合數據的時候,才向數據庫發送執行sql的語句(又叫做懶加載)

  當查詢用戶,同時可以獲取用戶關聯的list集合的數據,(因為存在正確映射)

  1 package com.bie.test;
  2 
  3 import java.util.ArrayList;
  4 import java.util.HashMap;
  5 import java.util.HashSet;
  6 import java.util.List;
  7 import java.util.Map;
  8 import java.util.Set;
  9 
 10 import org.hibernate.Session;
 11 import org.hibernate.SessionFactory;
 12 import org.hibernate.Transaction;
 13 import org.hibernate.cfg.Configuration;
 14 import org.junit.Test;
 15 
 16 import com.bie.po.User;
 17 
 18 /** 
 19 * @author BieHongLi 
 20 * @version 創建時間:2017年3月15日 下午4:31:23 
 21 * 
 22 */
 23 public class SetTest {
 24 
 25     //私有化session工廠
 26     private static SessionFactory sf;
 27     static{
 28         //首先默認加載src/hibernate.cfg.xml文件
 29         //其次創建session工廠文件
 30         sf = new Configuration()
 31                 .configure()
 32                 //.addClass(User.class),測試的時候可以使用這個代替加載映射文件<mapping resource="com/bie/po/User.hbm.xml"/>
 33                 .buildSessionFactory();
 34     }
 35     
 36     @Test
 37     public void test(){
 38         //創建session
 39         Session session = sf.openSession();
 40         //創建session開啟事務
 41         Transaction tx = session.beginTransaction();
 42         
 43         //保存
 44         Set<String> addressSet = new HashSet<>();
 45         addressSet.add("北京");
 46         addressSet.add("上海");
 47         
 48         //用戶對象
 49         User user = new User();
 50         user.setName("tom");
 51         user.setAddress(addressSet);
 52         
 53         //保存到session中
 54         session.save(user);
 55         
 56         tx.commit();
 57         //session.getTransaction().commit();這樣寫就不用使用事務tx接受了,更加方便快捷
 58         session.close();
 59     }
 60     
 61     @Test
 62     public void test2(){
 63         //創建session
 64         Session session = sf.openSession();
 65         //開啟事務
 66         session.beginTransaction();
 67         
 68         //List集合保存
 69         List<String> list = new ArrayList<>();
 70         list.add("深圳");
 71         list.add("廣州");
 72         
 73         //User用戶
 74         User user = new User();
 75         user.setName("張三");
 76         user.setAddressList(list);
 77         
 78         //保存實體類
 79         session.save(user);
 80         
 81         //提交事務
 82         session.getTransaction().commit();
 83         //關閉session
 84         session.close();
 85     }
 86     
 87     @Test
 88     public void test3(){
 89         Session session = sf.openSession();
 90         session.beginTransaction();
 91         
 92         Map<String, String> map = new HashMap<String,String>();
 93         map.put("1001", "新鄉");
 94         map.put("1002", "鄭州");
 95         
 96         User user = new User();
 97         user.setName("李四");
 98         user.setAddressMap(map);
 99         
100         session.save(user);
101         
102         session.getTransaction().commit();
103         session.close();
104     }
105     
106     @Test
107     public void getList(){
108         Session session = sf.openSession();
109         session.beginTransaction();
110         
111         User user = (User)session.get(User.class, 2);
112         System.out.println(user.getId());
113         System.out.println(user.getName());
114         
115         //當查詢用戶,同時可以獲取用戶關聯的list集合的數據,(因為存在正確映射)
116         //當使用集合數據的時候,才向數據庫發送執行sql的語句(又叫做懶加載)
117         System.out.println(user.getAddressList());
118         
119         session.getTransaction().commit();
120         session.close();
121     }
122     
123 }

演示效果如下所示,需要注意的是,這里使用自動創建表的:

如果生活也是這般,有簡到難,該多好~~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM