Hibernate-事物管理

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())可以做更新,刪除
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章