Hibernate開發心得

Hibernate開發心得
hibernate核心接口:
Session 、 Transaction 、 Query 、Configuration

Configuration :配置、根啓動Hibernate 創建SessionFactory對象
SessionFactory :初始化Hibernate創建Session對象
Sesssion :負責保存、更新、刪除、加載和查詢對象
Transaction :管理事務
Query和Criteria : 執行數據庫查詢

Query query = session.createQuery("from Customer c where c.name =:name");
query.setParameter("name","tom",Hibernate.STRING);

Sessin 接口方法 :
save();
updata();
delete();
load();
find();
Session 通過 SessionFactory.opensession()方法獲得;
控制事務一起Transaction
Session session = SessionFactory.openSession();
Transaction tx = null ;
try{
     tx = session.begionTransaction();
     //邏輯方法
     tx.commit();
}
catch(Exception e){
       e.printStackTace();
       if(tx != null)tx.rollback();
       thows e ;
}
finlly{
       session.close();
}

//session.save(customers)執行下列SQL語句:
insert into CUSTMERS (ID , NAME , EMAIL , PASSWORD , PHONE , ADDRESS , SEX , IS_MARRIED , DESCRIPTION ,
   IMAGE , BIRTHDAY , REGISTERED_TIME ) VALUES (1 , 'TOM' , '1234', 55556666 ,'SHANGHAI','M' , 0 ,
   'I AM VERY HONEST' @ ,'1980-05-06' , NULL);

//session.find("from customer as c order by c.name asc")執行下列SQL語句:
select * from CUSTOMERS order by name asc ;

//(customer)session.load(customer.class,customer_id)執行下列SQL語句:
select * from CUSTOMERS WHERE ID = 1 ;
update CUSTOMERS SET NAME = 'TOM' ,EMAIL ='[email protected]' ,ADDRESS = 'BEIJING' WHERE ID = 1;

//session.delete("from CUSTOMER AS C");執行下列SQL語句:
select * from CUSTOMERS ;
DELETE FROM CUSTOMERS WHERE ID = 1;
或是:session.load(customers.class,id);
       session.delete(customer);
或是:
       session.load(customers.class,new int(1));                                          

/////////////////映射對象標識符
Hib中的標識符來建立內存中的對象和數據庫表中記錄的對應關係,對象的OID和數據庫表的主鍵對應。爲了保證OID的唯一性和不可變性,應該讓Hib給OID賦值。
/////////////////映射一對多關聯關係
在關係數據庫中,只存在外鍵參照關係,而且總是由many方參照one方。爲了消除數據冗餘,關係性數據庫只能支持多對一或是一對一的單向關聯。
/////////////////操作持久化對象
session的實體對象狀態分爲三種:遊離對象,持久化對象,臨時對象
臨時對象 :不處於session的緩存中,不和任何的session實例關聯,數據庫中無記錄。
        例:order o = new order();通過new剛剛創建的java對象處於臨時狀態
            session的delete方法使遊離態,持久化的對象轉變爲臨時狀態
持久化對象:位於session的緩存中,總是被一個session實例關聯,和數據庫中記錄對應
            session的save方法使臨時態變爲持久化
            session的load,get方法返回對象總是處於持久化狀態
            session的find方法返回list存放的都是持久化對象
            session的update,saveOrUpdate,lock方法使遊離態轉換爲持久態對象
            一個持久化對象和臨時對象有級聯保存的時候session在清空緩存的時候會
            把臨時對象轉化爲持久對象
遊離態對象:不位於session的緩存中,不被session關聯,數據庫中可能有記錄
            session的close方法使緩存清空,緩存中的所有持久化對象變爲遊離態
            session的evict方法從緩存中刪除一些持久化對象,不推薦使用應該通過
            查詢語句來控制對象的深度。
////////////////session的保存,更新,刪除和查詢
保存:session.save();
   customer c = new coustomer();
   c.setid(new log(9)) ;
   c.setname ("tom");
   session s = sessionF.opensession();
   transaction tx = s.beginTransaction();
   s.save(c);
   tx.commit();
   session.close();
   如果想改變OID的值應使用save的重載save(customer,new long(9));不推薦使用
save方法是當session清理緩存時纔會執行insert語句,如果在save以後又對對象進行    修改session會再執行一次update操作。
   如果save方法已執行不能修改其OID屬性。

更新:session.update();
   customer c = new customer();
   c.setname("tom");
   session s = sessionF.opensession();
   Transaction tx = s.beginTransaction();
   s.save(c);
   tx.commit();
   session.close();//遊離態
   c.setname("too");
   session2.update(c);
   session2.close();//使session2和c關聯都會執行一次update修改操作。
   session的saveOrUpdate方法同時包含了save和update方法,如果傳入的是臨時對象調   用save方法,如果傳入是遊離態就調用update方法如果傳入是持久化,就直接返回。

查詢:session的load,get和find方法
   session的load和get方法根據給定的OID從數據庫中加載一個對象,load方法在沒有找   到對象時拋出notFoundException異常,get方法返回null。
   get和load和其他查詢方法返回的對象位於session的緩存中,修改了對象的屬性後,   session清理緩存時,會根據持久化對象的屬性來更新數據庫。
   list CUSTOMER = SESSION.FIND("FROM CUSTOMER AS C WHERE C.ID = 1")返回關於 customer的一個集合。

刪除:session.delete方法,由於從數據庫中刪除對象對應的記錄,如果出入的是持久化對象session就計劃執行一個delete語句。如果出入的參數是遊離態對象,先使它成爲持久化對象,然後計劃執行一個delete語句。session只有在清理緩存的時候纔會執行delete語句。只有當調用session的close()方法時纔會從session的緩存中刪除對象。
   session.delete("from customer as c where c.id > 8") ;
/////////////session的檢索機制 load(),get(),find();
用來對數據庫中檢索對象,load()和get()方法按照給定的OID加載一個持久化對象,find方法按照參數指定的HQL語句加載一個或多個持久化對象
CUSTOMER C = (CUSTOMER)SESSION.LOAD(CUSTOMER.CLASS,NEW LOAG(1));
CUSTOMER C = (CUSTOMER)SESSION.GET(CUSTOMER.CLASS,NEW LOAG(2));
LIST CUSTOMER = SESSION.FIND("FROM CUSTOMER AS C WHERE C.ID = 1");
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章