Hibernate的API一共有6個,分別爲:Session、SessionFactory、Transaction、Query、Criteria和Configuration。
通過這些接口,可以對持久化對象進行存取、事務控制。 詳情請百度.......
============================================================================================
Hibernate 4.0 版本
在CRUD操作執行完成後,釋放資源階段,如果僅僅是關閉session 進程無法停掉
還需要關閉會化工廠 SessionFactory.close()
還需要銷燬 StandardServiceRegistry 實例 ssr
===> StandardServiceRegistryBuilder.destroy(ssr);
================================
1/提取出公共工具類:
-----------------------------------------------------------
public class HibernateSessionFactory {
private final static SessionFactory sessionFactory;
static {
try{
sessionFactory =new Configuration().configure().buildSessionFactory();
}catch (Exception e) {
e.printStackTrace();
throw new ExceptionInInitializerError(e);
}
}
public static Session getCurrentSession () {
return sessionFactory.getCurrentSession();
}
public static Session getOpenSession () {
return sessionFactory.openSession();
}
}
-----------------------------------------------------------
2/根據主鍵查詢操作
a/ Object get(class , id ) 若數據不存在返回null
b/ Object load(class , id ) 若數據不存在返回ObjectNotFoundException
-----------------------------------------------------------
(一) Hibernate 動態更新
--> 這裏記錄基於API的三種方式進行簡單的更新
1/ 使用update()方法
這個方法會直接進行跟新
2/ 使用load() 方法
-----------------------------------------------------
public void updataUser(User user) {
try {
transaction = HibernateSessionFactory.getCurrentSession().beginTransaction();
//加載獲取數據庫中存儲的數據 保存爲一個快照--> 緩存
User userToUpdate = userDao.loadUser(user.getId());
// 分別對每個屬性進行賦值 --> 在快照的基礎上進行比對,對發生變化的數據進行更新
userToUpdate.setAge(user.getAge());
userToUpdate.setName(user.getName());
userToUpdate.setPwd(user.getPwd());
transaction.commit();
}catch (Exception e){
e.printStackTrace();
if (transaction!=null){
System.out.println("異常回滾");
transaction.rollback();
}
}
}
-----------------------------------------------------
3/ 使用merge方法 動態更新 每次更新前都會進行查詢 類同2, 但不用賦值
-----------------------------------------------------------
(二) 刪除
-----------------------------------------------------------
1/ 常見異常處理:
not-null property references a null or transient value : com.bdqn.entity.User.age
---> 這個異常是因爲:
<property name="age" column="age" type="java.lang.Integer" length="10" not-null="true"/>
==> hibernate 在進行數據封裝時, 通過xml校驗到 age屬性是null的,而正如上面的
配置,notnull="true", 所以報錯,但是在三層結構中,對於一般的數據
大部分都會在service和web層等做完校驗,二者dao層應當校驗完畢,
dao層處理的數據都應是一個有效數據.
notnull 使用需適當
2/ 如果主鍵增長策略是assign 則在執行刪除的時候, Hibernate會先進行查詢主鍵是否有效,是否會返回
一個正確有效的對象,然後進行刪除
-----------------------------------------------------------
刪除的兩種API方式 : 1 / 通過傳入一個id數據 , 然後調用load/get方法獲取一個對象
調用delete方法刪除對象
2 / 通過傳入的id封裝爲一個只含有id屬性的對象,直接調用delete方法刪除,但
此方法使用需要結合xml配置裏的非空驗證
-----------------------------------------------------------
-----------------------------------------------------------
( 三 ) 三種狀態
----------------------------------------------
狀態 內存 session
瞬時態 × ×
遊離態 √ ×
持久態 √ √
----------------------------------------------
髒對象: 執行完查詢或者其他某個操作 , 將遊離態對象轉變成了持久態,最初的時候 Hibernate會給
拿到的數據一個快照,在接下來使用過程中很有可能對當前這個對象會做出一些修改,導致數據
發生變化,一旦發生變化,這個對象就被成爲了髒對象.
=========== > 在hibernate中狀態前後發生改變的對象,稱爲髒對象
髒檢查; 一旦數據發生變化,Hibernate就回進行髒檢查,一旦發現髒對象,就回執行同步操作,保持和數據庫
數據一致
===> 髒檢查觸發的時機 :
a/ 事務提交 tx.commit() 時觸發
b/ 刷新緩存 tx.flush() 時觸發
========================================================================================