Hibernate(2)上

一、hibernate中的实体生成规则
A、实体类创建的注意事项:
1.持久化类提供无参数构造
2.成员变量私有,提供私有get/set方法访问
3.持久化类的属性,应尽量使用包装类
4.持久化类需要提供oid与数据库中的主键列对应
(没有主键的表不能用Hibernate映射)
5.不要用final修饰class
(hibernate使用cglib代理生成代理对象,代理对象是继承被代理对象,如果被final修饰则无法被继承,无法被代理)

B、主键类型:
1.自然主键
表的业务列中,有某业务符合,必须有,并且不重复的特征时,该列可以作为主键使用。
2.代理主键(常见)
表的业务列中,没有某业务符合,必须有,并且不重复的特征时,创建一个没有业务意义的列作为主键使用。

C、主键生成策略(generator):
主键生成策略,就是每条记录录入时,主键的生成规则.
identity:主键自增,由数据库来维护主键值,录入时不需要指定主键.
increment(了解):主键自增,由hibernate来维护,每次插入前会先查询表中id最大值,+1作为新主键值(线程安全问题)
sequence:Oracle中的主键生成策略。
hilo(了解):高低位算法,由hibernate来维护,数据库中主键自增。(开发时不使用)
native:hilo+sequence+identity 自动三选一策略。
uuid: 产生随机字符串作为主键。主键类型必须是String类型
assigend:自然主键生成策略,hibernate不会管理主键值,由开发人员自己录入。

二、hibernate中的对象状态:
对象分为三种状态:瞬时状态、持久化状态、游离|托管状态
瞬时状态:没有id,没有与session关联
持久化状态:有id,与session有关联
游离|托管状态:有id,没有与session关联

//查看三种状态
public void fun1() {
	//1.获得session
	Session session = HibernateUtils.openSession();
	//2.控制事务
	Transaction tx = session.beginTransaction();
	//3.执行操作
	Customer c = new Customer();//没有id,没有与session关联  =>  瞬时状态
	
	c.setCust_name("联想公司");//没有id,没有与session关联  =>  瞬时状态
	
	session.save(c);//有id,与session关联,持久化状态
	//4.提交事务,关闭资源
	tx.commit();
	session.close();//有id,没有与session关联,游离|托管状态
}

瞬时状态:没有id,不在session缓存中
持久化状态:有id,
游离|托管状态:有id,没有与session关联
在这里插入图片描述学习对象三种状态结论:
将我们希望同步到数据库的数据,对应的对象转换为持久化状态。
saveOrUpdate :无论是瞬时还是游离状态都可以直接转换成持久化状态。

三、Hibernate进阶:一级缓存
缓存:提高效率,hibernate中的一级缓存也是为了提高操作数据库的效率。
提高效率手段1.提高查询效率
在这里插入图片描述缓存进阶——快照
提高效率手段2.减少不必要的修改语句发送
在这里插入图片描述四、hibernate中的事务

事务特性:可以看成是操作的容器 包裹着事务的操作
a:原子性 要么全成功,要么全失败
c :一致性 事务在操作前数据总量不发生变化
i :隔离性 来解决事务并发产生的问题
d :持久性 事务一旦提交数据一定要保存到硬盘上

事务并发差生的问题:
1.脏读:读到了某一个人正在操作还没有保存的数据
2.不可重复读 两次读取的数据不一致
3.幻/虚读:再删除整张表后由于某人操作留下多余的数据

事务的隔离级别:
读未提交:1.2.3
读已提交:2.3
可重复读:3 mysql默认级别
串行化:操作的数据没有问题 效率太低

知识点1.如何在hibernate中指定数据库的隔离级别
就是一行配置 在主配置中配置
在这里插入图片描述知识点2.如何在项目中管理事务
在业务开始之前打开事务,业务执行之后提交事务,执行过程中出现异常,回滚事务
在dao层操作数据库需要用到session对象,在sevice层控制事务也需要使用session对象,我们要确保dao层和sevice层使用的是同一个session对象
解决方案:将session对象绑定到当前操作的线程上,来确保一个线程之内无论是dao层还是service层用的都是同一个session对象 hibernate可以帮你解决
我们只需要调用sessionFactory.getCurrentSession对象即可与当前线程绑定的session对象
注意1:一定要在主配置文件中增加一段配置
在这里插入图片描述注意2:通过getCurrentSession方法获得的session对象,当事务提交时session会自动关闭,不要手动调用close关闭
service层在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值