Hibernate 事務管理
- 事物管理
- 關係映射
Hibernate的生命週期
1、瞬時態(Transient)
new pojo對象的時候,這個時候數據表是沒有和session有關聯的。
2、持久態(Persistent)
進行save的時候,和sessiion存在關聯。進行delete進入瞬時態。
3、託管態(Detached)和數據庫可能存在關係(存在主鍵的值)
關閉session的時候,託管狀態和session沒有關係。執行update變成持久態。
Hibernate事物的管理
事物的特性:原子性(要麼成功要麼失敗),一致性(commit提交前後的狀態一直),隔離性(多線程防止數據出現混亂),持久性(對數據進行持久化)
事物的級別:
* 在sevice接口中實現對事物的控制
讓當前線程和session綁定 threadLocal
// ThreadLocal實際上使用的工廠模式和ThreadLocal結合
private static ThreadLocal<Session> threadsession=new ThreadLocal<Session>();
public Session getCurentSession(){
//Hibernate提供的方法
// return=sessionFactory.getCurrentSession();
//Hibernate的內部原理
Session session=threadsession.get();
if(session == null){
session=sessionFactory.getsession();
threadsession.set(session);
return session;
}
return session;
}
public void closeCurentSession(){
//sessionFactory.getCurrentSession().close();
Session session=threadsession.get();
if(session != null){
session.close();
session.set(null);
}
}
關聯映射
(添加外鍵的sql語句:ALTER TABLE cst_linkman ADD CONSTRAINT 'lkm_cust_id ’ FOREIGN KEY (‘likm_cust_id’) REFERENCES)
在Hibernate中 一對多的配置
* 一對多的配置
<set name="一方中的屬性名">
<key>
<!--多方的外鍵-->
<column name="多方的外鍵名"></column>
<one-to-many class="多方類的全路徑名">
</key>
</set>
- 多對一的關係
<many-to-one name="一方的屬性名" class="客戶屬性類型">
<column name="外鍵名"></column>
</many-to-one>
數據字典
存儲了系統需要的基本類別信息,數據字典表到客戶表是一對多的關係。
- QBC
- HQL
延時加載(對象圖導航)
當要獲取一個對象的信息時,如果首先和獲取對象的一部分信息就能滿足需求,則僅加載對象的一部分信息,當需要對象關聯信息再加載關聯的信息。
(調用相應的get或者load方法即可)
load和get的區別
1、load 和get會產生代理對象
2、load在加載的時候不會立即執行sql語句。在調用get、的時候回去執行sql語句
3、get在加載的時候會立即執行sql語句
QBC
1、通過qbc按條件查詢,通過Criteria構造條件查詢
2、通過Critetia對象的拼接 查詢條件,調用Criteria的add方法拼接查詢的條件,最終Hibernate通過criteria對象自動生成sql語句
、、通過Criteria的對象的add方法進行拼接查詢條件
Criteia criteria=session.createCriteria(pojo對象的類的加載器.class)
criteria.add(Restrictions.eq("實體當中的屬性","內容"));
criteria.add(Restrictions.like("實體中的屬性","%內容%"));
、、設置單個投影列
criteria.setProjection(Projections.property("投影的列名"));
criteria.list();
、、設置多個投影列
criteria.setProjection(Projections.projectionList()
.add(Projections.property("投影的列名").as("別名")
.add(Projections.property("投影的列名").as("別名")));
生成的是Object數組,將Object數組轉化成pojo對象
criteria.setResultTransformer(new AliasToBeanResultTransformer(CstCustomer.class));
//select count(*)查詢總記錄數
criteria.setProjection(Projections.rowCount())
Long totle=criteria.uniqueResult();
- DetachedCriteria
DetachedCriteria是一個離線的Criteria DetachedCriteria不需要sesiion 功能上和Criteria相同 推薦是有DetachedCriteria
// 將離線的DetachedCriteria轉換成Criteria
DetachedCriteria detachCriteria=DetachedCriteria.forClass(對象.class);
Session session=獲取session
Criteria criteria=detachCriteria.getExecutableCriteria(session);
hql的學習
hql完全面向對象的查詢語句,一般只用於查詢和更新
String hql="from Customer"
//全部查詢
String hql="from Customer c where c.cusName like ?"
Query query =session.createQuery(hql);
query.setParameter("zhou%");
query.executeUpdate();
//查詢數據表中like zhou
String hql="from Customer c where c.cusName like ? and c.lkName = ?"
query.setParamerter(0,"aa");
query.setParameter(1,"bb");
//給佔位符起別名
String hql="from Customer c where c.cusName like :cus and c.lkName = :lk"
query.setParamerter(cus,"aa");
query.setParameter(lk,"bb");
//做投影查詢(基於面向對象的思維進行查詢)
String hql="select new (c.lktell,c.likPhone) from Customer c where c.cusName like :cus and c.lkName = :lk"
* QBC 只能做查詢,HQL 通過(executeUpdate())可以做更新,刪除