Hibernate笔记 第二天

什么是持久化类

Hibernate是持久层的ORM映射框架,专注于数据的持久化工作。所谓的持久化,就是将内存中的数据永久存储到关系型数据库中。

持久化类的编写规则:

编写持久化类时要注意:

  • 持久化类需要提供无参数的构造方法。因为在Hibernate的底层需要使用反射生成类的实例。
  • 持久化类的属性需要私有,对私有的属性提供公有的get和set方法。因为在Hibernate底层会将查询到的数据进行封装。
  • 持久化类的属性要尽量使用包装类的类型。因为包装类和基本数据类型的默认值不同,包装类的类型语义描述更清晰而基本数据类型不容易描述。
  • 持久化要有一个唯一标识OID与表的主键对应。
  • 持久化类尽量不要使用final进行修饰。

主键类型

自然主键 具有业务含义的字段作为主键,称为自然主键。
代理主键 把不具有业务含义的字段作为主键,称为代理主键

主键生成策略

其常用主键生成策略的名称和描述如下
increment 用于long、short或int类型,由Hibernate自动以递增的方式生成唯一标识符,每次增量为1。只有当没有其它进程向同一张表中插入数据时才可以使用,不能在集群环境下使用。适用于代理主键。
identity 采用底层数据库本身提供的主键生成标识符,条件是数据库支持自动增长数据类型。在DB2、Mysql、MS SQL SEVER、Sybase和HypersonicSQL数据库中可以使用该生成器。该生成器要求在数据库中把主键定义成自增长类型。适用于代理主键。
sequence Hibernate根据底层数据库序列化生成标识符。条件是数据库支持序列化。适用于代理主键。
native 根据底层数据库对自动生成符的能力来选择identity、sequence、hilo三种生成器中的一种,适合跨数据库平台开发,适用于代理主键。
uuid Hibernate采用128位的UUID算法来生成标识符。该算法能够在网路环境中生成唯一的字符串标识符,其UUID被编码为一个长度为32位的十六进制字符串。这种策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。适用于代理主键。
assigned 由java程序负责生成标识符,如果不指定id元素的generator属性,则默认使用该主键生成策略。适用于自然主键。

持久化对象三种状态

瞬时态(transient)

瞬时态也称为临时态或者自由态,瞬时态的实例是由new命令创建、开辟内存空间的对象,不存在持久化标识OID(相当于主键值),尚未与Hibernate Session关联,在数据库中也没有记录,丢失引用后被JVM回收。瞬时状态的对象在内存中是孤立存在的,与数据库中的数据无任何关联,仅是一个信息携带的载体。

持久态(persistent)

持久态的对象存在持久化标识OID,加入到Session缓存中,并且相关联的Session没有关闭,在数据库中有对应的记录,每条记录只对应唯一的持久化对象,需要注意的是,持久态对象是在事务还未提交前变成持久态的。

脱管态(detached)

脱管态也称离线态或者游离态,当某个持久化状态的实例与Session的关联被关闭时就变成了脱管态。脱管态对象存在持久化标识OID,并且仍然与数据库中的数据存在关联,只是失去了与当前Session的关联,脱管态状态对象发送改变时Hibernate不能检测到。
持久化对象的三种状态转换

Customer customer = new Customer(); //瞬时态
customer.setCust_id(1);//脱管态
脱管态变持久态:执行Session的update()saveOrUpdate()lock()方法。
脱管态转换为瞬时态:将脱管态对象的持久化标识OID设置为null。

Session session = HibernateUtils.openSession();
Transcation tx = session.beginTransaction();
xxx操作后
tx.commit();
session.close();
持久化对象能够自动更新数据库(不用update)

Hibernate的缓存分为一级缓存和二级缓存,Hibernate的两级缓存都位于持久化层,存储的都是数据库数据的备份。其中第一级缓存为Hibernate的内置缓存,不能被卸载。
一级缓存指Session缓存,Hibernate的一级缓存的作用就是减少对数据库的访问次数。

事务管理(ACID)

原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。比如在同一个事务中的SQL语句,要么全部执行成功,要么全部执行失败。
一致性(Consistency)
官网上事务一致性的概念是:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
换一种方式理解就是:事务按照预期生效,数据的状态是预期的状态。
表示事务完成时,必须使所有的数据都保持一致状态。
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

事务的并发读问题
脏读:读取到另一个事务未提交数据;
不可重复读:两次读取不一致;(针对数据数值查询)
幻读(虚读):读到另一事务已提交数据。(针对记录统计)
转自(https://blog.csdn.net/qq_26514509/article/details/85199703
第一种隔离级别:Read uncommitted(读未提交)
如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据,该隔离级别可以通过“排他写锁”,但是不排斥读线程实现。这样就避免了更新丢失,却可能出现脏读,也就是说事务B读取到了事务A未提交的数据

解决了更新丢失,但还是可能会出现脏读

第二种隔离级别:Read committed(读提交)
如果是一个读事务(线程),则允许其他事务读写,如果是写事务将会禁止其他事务访问该行数据,该隔离级别避免了脏读,但是可能出现不可重复读。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

解决了更新丢失和脏读问题

第三种隔离级别:Repeatable read(可重复读取)
可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数据(包括了读写),这样就可以在同一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别,读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务(包括了读写),这样避免了不可重复读和脏读,但是有时可能会出现幻读。(读取数据的事务)可以通过“共享读镜”和“排他写锁”实现。

解决了更新丢失、脏读、不可重复读、但是还会出现幻读

第四种隔离级别:Serializable(可序化)
提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行,如果仅仅通过“行级锁”是无法实现序列化的,必须通过其他机制保证新插入的数据不会被执行查询操作的事务访问到。序列化是最高的事务隔离级别,同时代价也是最高的,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读
转自(https://blog.csdn.net/zhouym_/article/details/90381606)

hibernate.current_session_context_class属性用于指定Session管理方式,可选值包括

  • thread: Session对象的生命周期与本地线程绑定
  • jta: Session对象的生命周期与JTA事务绑定
  • managed: Hibernate委托程序来管理Session对象的生命周期
    Hbernate的其他API
    Query代表面向对象的一个Hibernate查询操作。
    Criteria是一个完全面向对象,可扩展的条件查询API。
    SQLQuery接受sql语句进行查询,然后调用list()或者uniqueResult()方法进行查询。

内容摘自黑马hibernate内容

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值