一、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关闭