Hibernate实体规则、对象状态、session缓存、事务

Hibernate实体规则

javaBean规范

规范:
1.属性私有化,提供get/set方法 - 只有提供了get/set方法的成员变量才是属性
2.提供无参构造器
3.基本数据类型建议使用包装类
4.必须有主键oid对应属性
5.不能用final修饰 :hibernate使用cglib代理生成代理对象。代理对象是继承被代理对象。如果类被final修饰,将无法生成代理对象.

主键生成策略 generator

		<generator class="主键生成策略">
<!-- 			<param name="sequence"></param> -->
		</generator>

主键种类:
1.代理主键:业务无关,对象无关 - 项目开发中常使用该类型
2.自然主键:表中存在非空且唯一的字段,例如身份证号
主键生成策略:
1.代理主键的生成策略:
identity:数据库来维护,自增长,不需要手动录入
sequence:数据库维护,seq.nextVal,适用于Oracle数据库的序列方式,需要指定参数(序列名),不需要手动输入
increment:Hibernate维护,自增长,不需要录入,在插入之前会查找数据中id最大值,+1后插入
hilo:自增长算法
native:hilo+identity+sequence 自动检测
uuid:hibernate维护,32位,id类型设置为varchar(32)以上
2.自然主键的生成策略:
assigned:必须手动录入

Hibernate对象状态

1.瞬时状态:对象没有id,并且没有和session关联
2.持久化状态:对象有id,并且和session关联
-------------------内容发生修改,在事务提交时,都会同步到数据库
3.游离|托管状态:对象有id,并且没有和session关联
*ID:和数据库对比,如果数据库中有改id,则为有效ID,数据库中不存在,则为无效id

public void test02() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		// c - 瞬时状态
		Customer c = new Customer();
		c.setCust_name("新浪");
		System.out.println(c);//此时c对象没有id,并且与session没有关联
		
		session.save(c);//c对象拥有id
		// c - 持久化状态
		System.out.println(c);//c对象有id,并且与session关联
		tx.commit();
		session.close();
		// c - 游离状态
		System.out.println(c);
	}
	public void test03() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		
		Customer c = session.get(Customer.class, 1l);
		// c - 持久化状态
		System.out.println(c);
		tx.commit();
		session.close();
		// c - 游离状态
		System.out.println(c);//c有id,但是和session没有关联
	}
public void test04() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		
		Customer c = session.get(Customer.class, 3l);
		// c - 持久化状态
		System.out.println(c);
		
		session.delete(c); // -- 没打印
		
		System.out.println(c); 
		
		tx.commit(); // -- 执行sql语句
		session.save(c);
		session.close();	
	}
public void test05() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		
		Customer c = session.get(Customer.class, 2234236l);
		// c - 持久化状态
		System.out.println(c);
		c.setCust_linkman("王总");
		
//		session.update(c);
		//处于持久化状态对象内容发生修改,在事务提交时,都会同步到数据库
		tx.commit();
		session.close();
	}
	public void test06() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		
		// 游离状态
		Customer c = new Customer();
		c.setCust_id(7l);//数据库存在该id,但是c与session没有关联
		c.setCust_name("阿里妈妈");
//		session.update(c);
		session.saveOrUpdate(c);
		tx.commit();
		session.close();
	}

在这里插入图片描述

Session缓存

session是有缓存的,
在这里插入图片描述
缓存的作用:为了提高查询效率,Hibernate一级缓存
快照:节省不必要的update操作,提高效率

load:默认懒加载,使用对象时,彩之星sql语句,变成真正的对象

Hibernate事务

事务

1.事务特性:原子性、一致性、隔离性、持久性
2.事务并发问题:脏读1、不可重复读2、幻读3
3.事务的隔离级别:读未提交123、读已提交23、可重复读3、串行化

Hibernate中的事务

1.在Hibernate中设置事务隔离级别

<!--设置事务隔离级别  
		hibernate.connection.isolation 4(1|2|4|8)
		0001 1 读未提交
		0010 2 读已提交
		0100 4 可重复读
		1000 8 串行化
		-->
		
		<property name="hibernate.connection.isolation">4</property>

2.在项目中管理事务
1.业务开始之前打开事务,业务执行之后–提交事务 执行过程中出现异常–回滚事务
2.在dao层操作数据库需要用到session对象。在service控制事务也是使用session对象完成. 确保dao层和service层使用的同一个session对象
3.在hibernate中,确保使用同一个session的问题,hibernate已经帮我们解决了. 我们开发人员只需要调用sf.getCurrentSession()方法即可获得与当前线程绑定的session对象
注意1: 调用getCurrentSession方法必须配合主配置中的一段配置

注意2:通过getCurrentSession方法获得的session对象.当事务提交时,session会自动关闭.不要手动调用close关闭.

		<!--将session与当前线程绑定 -->
		<property name="current_session_context_class">thread</property>

4.crm项目中:
service层:
在这里插入图片描述
dao层:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值