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!
Hibernate映射文件配置
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.