Hibernate映射文件配置

id 主鍵生成方式
increment Hibernate內部自己做累加,而不是數據庫中做累加。

indentity 數據庫標示符自增長

squence Oracle常用

hilo 高低位 數據庫保存高位字段,Hibernate累加地位字段,新插入數據由這兩個字段組成,不會重複。

uuid 生成主鍵不用訪問數據庫,Hibernate生成,插入效率很高,主鍵string類型,查詢時候效率不高。

native 根據數據庫底層能力選擇identity squence hilo

assigned 手工分配主鍵

select 通過底層觸發器生成

foreigh 外鍵引用作爲主鍵




property屬性節點
update 是否允許修改列值,比如用戶名可以設爲不可修改

insert 是否允許插入列值

formula 計算列表達式定義,列在數據庫表中是沒有的。

lazy 懶加載,列的懶加載。

unique 是否唯一

not-null 是否允許空

index 索引名

unique-key 多列唯一,多列的unique-key值設爲一樣即可

length 長度

prescision 精度




Session是非線程安全的,生命週期較短,代表一個和數據庫的鏈接,在bs系統內一般不會超過一個請求
內部維護以及緩存和數據庫連接,如果session長時間打開會長時間佔用內存和數據庫的鏈接。

SessionFactory是線程安全的,一個數據庫對應一個SessionFactory,生命週期長一般在整個系統生命週期內有效;
SessionFactory保存着和數據庫連接的相關信息和映射信息,以及Hibernate雲心事要用到的一些信息。



 session內部緩存管理與批量更新

session.flush()方法強迫一級緩存和數據庫進行同步,如果主鍵生成方式不是native這類數據庫生成的,
那麼Hibernate的sql語句在事務提交或者查詢操作之前操作,將與數據庫的通信延後,不要頻繁的進行操作。
如果調用了flush方法,那麼就立即進行與數據庫的通信。

那麼在處理大批量數據插入的時候,會產生內存溢出的情況,因爲數據庫的通信並不是在一條記錄插入後,
而是在事務提交或者事務內部第一次查詢的時候,那麼一般來說,我們就只能插入20條更新一下數據庫的方法。

 
view plaincopy to clipboardprint?
01.for(int i=0;i<10000;i++){   
02.    s.save(user);   
03.    if(i%20 == 0){   
04.        s.flush();   
05.        s.clear();   
06.    }   
07.}  
for(int i=0;i<10000;i++){
    s.save(user);
    if(i%20 == 0){
        s.flush();
        s.clear();
    }
} 

需要及時的提交數據庫更新操作和清空緩存。

也可以使用StatelessSession 無狀態的session,即不使用緩存。使用方式和session一樣。

在處理大批量更新的時候,Hibernate3.0以前只能一條一條更新,在3.0以後可以使用批量更新的hql語句

view plaincopy to clipboardprint?
01.Query query = session.createQuery("update u set birthday = :bd from User as u");   
02.query.executeUpdate();  
Query query = session.createQuery("update u set birthday = :bd from User as u");
query.executeUpdate(); 

但是這種批量更新的方式會清空一級緩存而二級緩存,而且在關聯的版本號上可能由些問題。


hql與criteria查詢方式補充

查詢多個對象select art,user from Article art,User user where art.author.id = user.id and art.id = :id這種方式返回的是Object[],Objectp[0]:article,Object[1]:user。

查詢的時候儘量使用get方法,因爲get方法會從緩存裏找數據,而缺省情況下hql語句是不會將查詢結果放入緩存的。

DetachedCriteria離線查詢,處理動態查詢。

 
view plaincopy to clipboardprint?
01.static List dc(DetachedCriteria dc){   
02.    Session s = HibernateUtil.getSession();   
03.    Criteria c = dc.getExecutableCriteria)s_;   
04.    List rs = c.list();   
05.    s.close();   
06.    return rs;   
07.}  
static List dc(DetachedCriteria dc){
    Session s = HibernateUtil.getSession();
    Criteria c = dc.getExecutableCriteria)s_;
    List rs = c.list();
    s.close();
    return rs;
}
 

調用語句

view plaincopy to clipboardprint?
01.DetachedCriteria dc = DetachedCriteria.forClass(User.class);   
02.String name = request.getParameter("name");   
03.if(name != null){   
04.    dc.add(Restrictions.eq("name",name));   
05.}   
06.List users = dc(dc);  
DetachedCriteria dc = DetachedCriteria.forClass(User.class);
String name = request.getParameter("name");
if(name != null){
    dc.add(Restrictions.eq("name",name));
}
List users = dc(dc); 

就可以完成一個動態添加查詢條件的Criteria。



完畢 end!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章