框架第七天

weixin_34007886發表於2016-12-11

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),而不是資料庫中的表名
  • 利用createSQLQuery查詢
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;
    }
  • 利用createSQLQuery修改
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();
    }

相關文章