持久層框架--hibernate(2)

一 .持久化對象的oid 映射爲數據庫表的主鍵,惟一不重複sql

當數據庫表中的主鍵爲代理主鍵時,持久化對象的oid 要交給hibernate來維護(避免重複)數據庫

當數據庫中表的主鍵爲天然主鍵時,持久化對象的oid 要由程序自己來維護

主鍵生成策略(生成持久化oid的方式):

1. increment 帶走+1
由hibernate來維護oid的值,
優勢:與底層數據庫類型無關
缺點:只適用於單線程對數據庫的訪問

2. identity +1帶走
優勢:適合多用戶訪問
缺點:因爲+1操做由數據庫完成,因此數據庫必須支持自增Mysql,sql server,db2

3. sequence
由數據庫來維護oid的值
數據庫要支持序列 Oracle,db2緩存


4. native
根據底層數據庫的能力選擇 identity、sequence 或者 hilo 中的一個。
持久化對象的oid類型必須爲 long,short 或者 int 類型的,不能使用byte

5. uuid
數據庫表中數據量很是大,但不會常常進行查詢操做,就可使用字符串做爲表單主鍵。

6. assigned 手動分配id
適用於天然主鍵
好比:loginName做爲主鍵


三. 定義持久化對象屬性時,若是屬性爲基本數據類型,最好使用對應的包裝類型

int score;//0
Integer score;//nullsession

 

四. 快照
session的一級緩存 存在快照區域
只有在查詢操做時,會產生快照區域
快照區域保存查詢對象的原始狀態
當session執行flush方法時,會用緩存中的對象和快照中的原始數據進行比較
若是兩組數據不一樣,則自動發送update來更新數據庫app

 

數據庫中,本身手動建立序列ide

對應Customer.hbm.xml作的修改:工具

       <generator class="native">
              <param name="sequence">cus_id_seq</param>
</generator>
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC 
 3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping>
 6     <class name="com.edu.oid.Customer" table="tab_customer">
 7         <id name="id" column="id" type="integer">
 8             <!-- 主鍵生成策略 
 9             <generator class="native">
10                 <param name="sequence">cus_id_seq</param>
11             </generator>
12             -->
13             <generator class="assigned"/>
14         </id>
15         
16         <!-- 配置普通屬性 -->
17         <property name="name" column="name" type="string"/>
18         <property name="age" column="age" type="integer"/>
19         <property name="des"/>
20     </class>
21 
22 </hibernate-mapping>

序列跟主鍵號才能一一對應單元測試

 

二 .持久化對象生命週期的4種狀態:測試

    1. 臨時狀態(瞬時狀態)
    2. 持久化狀態
    3. 遊離狀態
    4. 刪除狀態

session對象一級緩存 線程級別的緩存 內置的必須使用
sessionFactory對象 二級緩存 進程級別的緩存 可配置(插拔)ui

  1 package com.edu.cache;
  2 
  3 import org.hibernate.SessionFactory;
  4 import org.hibernate.Transaction;
  5 import org.hibernate.cfg.Configuration;
  6 import org.hibernate.classic.Session;
  7 import org.junit.Test;
  8 
  9 /**
 10  * 使用單元測試工具,測試hibernate 的增刪改查(CRUD)操做
 11  * 
 12  * @author Administrator
 13  * 
 14  */
 15 public class TestHibernate {
 16 
 17     private static SessionFactory sf;
 18     static {
 19         // 1. 加載配置文件
 20         Configuration cfg = new Configuration();
 21         cfg.configure("com/edu/cache/hibernate.cfg.xml");
 22 
 23         // 2. 得到SessionFactory
 24         sf = cfg.buildSessionFactory();
 25     }
 26     
 27 
 28     @Test
 29     public void find() {
 30         
 31         
 32         Session session = sf.openSession();
 33         Transaction tran = session.beginTransaction();
 34         
 35         Customer c1 = (Customer) session.get(Customer.class, 1);//發生sql
 36         Customer c3 = (Customer) session.get(Customer.class, 2);//發生sql
 37         Customer c2 = (Customer) session.get(Customer.class, 1);//不發生sql
 38         
 39         tran.commit();
 40         session.close();
 41     }
 42     
 43     @Test
 44     public void flush() {
 45         
 46         
 47         Session session = sf.openSession();
 48         Transaction tran = session.beginTransaction();
 49         
 50         //臨時狀態    新建對象   不被session緩存管理,oid的值爲null
 51         Customer c = new Customer();
 52         c.setName("張三");
 53         
 54         /*
 55          *  歸入到session緩存管理,併爲其分配了oid的值,由臨時狀態轉變爲持久化狀態
 56          *  數據庫中沒有與之關聯的記錄
 57          */
 58         session.save(c);//不發送insert
 59         
 60         //刷新緩存,被生產sql語句發送給數據庫,並準備執行
 61         session.flush();//發送
 62         
 63         /*
 64          * 執行sql語句,影響數據庫中的記錄
 65          * 若是程序中沒有手動調用flush方法,
 66          * commit提交事務前,會自動調用flush.
 67          */
 68         tran.commit();
 69         //session關閉,緩存釋放,由持久化狀態轉換爲遊離狀態。處於遊離狀態的對象生命週期並無結束
 70         session.close();
 71         System.out.println(c.getName());
 72         c = null;//對象c的生命週期結束
 73     }
 74     
 75     //清空緩存
 76     @Test
 77     public void clear() {
 78         
 79         
 80         Session session = sf.openSession();
 81         Transaction tran = session.beginTransaction();
 82         
 83         Customer c1 = (Customer) session.get(Customer.class, 1);//發生sql
 84         session.clear();
 85         Customer c2 = (Customer) session.get(Customer.class, 1);//發生sql
 86         
 87         tran.commit();
 88         session.close();
 89     }
 90     //清除
 91     @Test
 92     public void evict() {
 93         
 94         
 95         Session session = sf.openSession();
 96         Transaction tran = session.beginTransaction();
 97         
 98         Customer c1 = (Customer) session.get(Customer.class, 1);//發生sql
 99         Customer c2 = (Customer) session.get(Customer.class, 2);//發生sql
100         session.evict(c1);
101         
102         Customer c3 = (Customer) session.get(Customer.class, 1);//發生sql
103         //Customer c4 = (Customer) session.get(Customer.class, 2);//不發生sql
104         session.update(c1);//c1從遊離狀態轉爲持久化狀態
105         
106         tran.commit();
107         session.close();
108     }
109     
110     //批量插入50萬條記錄
111     /*@Test
112     public void batchSave() {
113         
114         
115         Session session = sf.openSession();
116         Transaction tran = session.beginTransaction();
117         
118         for(int i=0;i<500001;i++) {
119             Customer c = new Customer();
120             c.setName("tom"+i);
121             session.save(c);
122             
123             if(i%10000==0) {
124                 session.flush();//向數據庫發送了10000條insert語句
125                 session.clear();//清空緩存
126             }
127         }
128         
129         tran.commit();
130         session.close();
131     }*/
132     
133     //快照
134     @Test
135     public void kuaiZhao() {
136         
137         
138         Session session = sf.openSession();
139         Transaction tran = session.beginTransaction();
140         
141         Customer c = (Customer) session.get(Customer.class, 1);
142         c.setName("tom");
143         System.out.println(c.getId());
144         
145         
146         //更新前查詢,避免由此操做更名了持久化對象的狀態,二影響數據庫中的記錄。
147     //    session.refresh(c);
148     //    session.update(c);
149         
150         tran.commit();
151         session.close();
152     }
153     
154 }
相關文章
相關標籤/搜索