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