1、Hibernate 中get 和 load的區別
載入方式:
load為延遲載入(返回的是一個只有id屬性的代理,
只有使用該物件屬性時,才發出sql語句);
get為立即載入(執行時,會立即向資料庫發出sql語句)
返回結果:
load檢索不到記錄時,會拋ObjectNotFoundException異常
get檢索不到記錄時,會返回null
2、Hibernate的快取機制
Hibernate快取包括兩大類:Hibernate一級快取和Hibernate二級快取。
(1).Hibernate一級快取又稱為“Session的快取”。
Session內建不能被解除安裝,Session的快取是事務範圍的快取
(Session物件的生命週期通常對應一個資料庫事務或者一個應用事務)。
一級快取中,持久化類的每個例項都具有唯一的OID。
(2).Hibernate二級快取又稱為“SessionFactory的快取”。
由於SessionFactory物件的生命週期和應用程式的整個過程對應,
因此Hibernate二級快取是程式範圍或者叢集範圍的快取,
有可能出現併發問題,因此需要採用適當的併發訪問策略,
該策略為被快取的資料提供了事務隔離級別。
第二級快取是可選的,是一個可配置的外掛,
預設下SessionFactory不會啟用這個外掛。
3、Hibernate的生命週期
ransient(臨時)
new 一個初始化物件後,並沒有在資料庫裡儲存資料,處於臨時狀態;
Persistent(持久化)
當執行save()方法,呼叫session.close()方法之前,
記憶體中的物件與資料庫有對應關係處於持久化狀態;
Detached(託管/遊離)
當執行session.close()之後,處於託管狀態;
4、Hibernate的主鍵生成方式
increment (mysql資料庫使用,適用所有資料庫):
先查詢出最大id,在此基礎上加1 ,有可能出現併發訪問問題。
Sequence(Oracle使用)
assigned:指派(重複插入資料時會違反資料唯一性)適用所有資料庫
native (資料庫本地生成策略,適用多個資料庫)
uuid.hex:生成一個32位,不會重複的主鍵,可以達到真正的跨資料庫(通常來說對應的應該是String資料型別)適用所有資料庫
foreign: 通常在一對一主鍵關聯的時候使用,基於外來鍵的主鍵生成策略。
自動增長identity:
適用於MySQL、DB2、MS SQL Server,採用資料庫生成的主鍵,
用於為long、short、int型別生成唯一標識
使用SQL Server 和 MySQL 的自增欄位,這個方法不能放到 Oracle 中,
Oracle 不支援自增欄位,要設定sequence(MySQL 和 SQL Server 中很常用)
5、Hibernate中的HQL語句與查詢SQL語句
Hibernate查詢語言:接近SQL【結構化查詢語言】的語法.
Hibernate3的HQL是不支援insert;
HQL中沒有表和欄位的概念,只有類和屬性的概念。
HQL語言操作的是持久化類,所以區分大小寫,
也就是說from後面跟的是實體類(JavaBean),而不是資料庫中的表名
public List<Part> listPart(int currentPage,int pageSize){
String sql="select * from part limit ?,?";
//hibernate解決複雜sql語句
SQLQuery query = session.createSQLQuery(sql);
query.setInteger(0, (currentPage-1)*pageSize);
query.setInteger(1, pageSize);
query.addEntity(Part.class);//新增實體類
List<Part> list=query.list();
return list;
}
public void insertPart2(Part part){//用原生的sql語句
Transaction beginTransaction = session.beginTransaction();
String sql="insert into Part values(null,?,?,?)";
Query query= session.createSQLQuery(sql);
query.setString(0, part.getName());
query.setString(1, part.getPwd());
query.setString(2, part.getRole());
query.executeUpdate();//執行修改或刪除
beginTransaction.commit();//提交事務
session.close();
}