您的位置:首页 > 编程语言 > Java开发

Hibernate基础加强

2017-11-04 15:20 169 查看
1.0 什么是持久化类 概述


   Hibernate  是orm 映射持久层框架 ,专注与数据持久化的操作 ,所谓的持久化,就是将数据存入磁盘中,从而让数据能够长久的保存, 那么什么是持久化类呢 ,其实所谓的持久化类值得是 数据库表和一个类建立映射关系,那么这个类就可以称为持久化类,大白话就是  一个类 使用了xm(映射文件)l关联了数据库的一个表,那么这个类就是持久化类 . 那么写持久化类有什么要求呢?

1.1持久化类的编写规则

   
1.持久化类要提供无参构造方法    因为hibernate 的底层是通过反射来获取对象的  

    2. 持久化类的属性要私有,并且要提供set get 方法 , hibernate 的底层 是通过set get 来封装参数,

    3. 持久化类使用封装数据类型, 因为数据转换会影响效率,并且在 sql 优化时可能会导致索引失效. 而且默认值不同,就取一个简单的例子,创建了一张员工表,  员工表的奖金列是使用double类型的,当奖金为零时, 可能会出现很多种情况, 可能是员工本来就没有奖金,  还有种可能是 员工可能有奖金,但是被扣完了  .. 这样表达的意思没有那么明显 ,   

 但是如果是使用Double 封装数据类型的话 ,当员工本没有奖金时,插入的会是 null  , 当有奖金被扣完时,显示的会是零,这就很好的解决了这个问题.

   4.持久化类尽量不要使用final修饰, 因为hibernate有加载延迟机制,加载延迟会产生代理对象 , 如果使用fianl 修饰类,就无法产生类的代理对象, 也就相当与 加载延迟机制(一种优化机制) 会失效.

   5. 持久化类要有一个唯一标识与主键对应.因为hibernate 需要使用 唯一标识来区分内存中是否是同一个持久化对象, Java中用使用地址来区分是否是同一个对象的,在关系型数据库中使用主键来区分是否是同一条数据,hibernate 不允许

内存中出现俩个相同的标识的持久化对象的,就好比如java 中不能出现相同地址的对象,   关系型数据库中一个表不能出现俩个相同的主键,

2.0我们已经大致了解持久化类,由于抽象化类通常需要一个标识符与表的主键建立关系, 我们不能让用户来手动生成标识符, 所以我们来了解了解  Hibernate 主键生成策略

2.1  主键生成策略分为俩种,  一种是自然主键,一种是代理主键,

 自然主键  : 把具有业务含义的字段用来当作主键, 以name 为 例 ,  name 不能 为 null , 不能重复. 大大加大了代码的难度 ,,开发中bu

 代理主键  : 把不具备业务含义的字段用来当作主键, 推荐使用

  hibernate 推荐的生成主键策略

hibernate 三种对象状态

 1.瞬时态

   瞬时态 同时被称为零时态或自由态, 是有new 命令创建,开辟内存空间,不存在内存标识符.没有与session 关联, 没有提交事务, 大白话讲就是实例化对象没有使用session 保存之前的状态,瞬时态是孤立的,没有与数据库的任何关联,只是一个携带信息的信息容器.失去引用后会被jvm收回.

 2.持久态

  持久态的对象存在标识符,存在session 里, 但是session 没有关闭 , 在数据库中存在对象的信息,需要注意的是,持久态对象实在事务还未提交之前变成持久态的, 我个人的理解是用session 保存的时候用瞬时态 变成持久态

3.托管态

托管态称为离线或者游离态 , 当摸个持久态的对象与session 关联    ,session 关闭的时候变成托管态,托管态对象与数据库还有联系,但是和当前session失去了关联. 托管态对象被修改时 hibernate 无法发觉

需要注意的是

托管态无法转换成其它状态. 持久态对象能够自动更新数据库 .

hibernate 一级缓存

相信缓存大家非常熟,它介于应用程序和持久化数据之间.是临时的数据.作用是降低服务器的内存消耗.从而提高应用的效率.Hibernate 分为 一级缓存 , 二级缓存 , 都存储在持久层,存储的数据都是数据库备份的.其中一级缓存为hibernate的内置缓存,不能被卸载,下面我们来详细说说一级缓存.

什么是一级缓存?

一级缓存其实就是session 缓存, 当使用session 查询时, session 会使用唯一标识符(id)去缓存里查找,如有有对应的标识符,就不再访问数据库,直接把缓存的数据返回给用户. 如果没有相同的唯一标识符. 那么就会去数据库查找,同时把数据缓存到session 缓存里面,大大降低了数据库的访问次数,

接下来,我们来测试缓存 .

输出结果

一级缓存,快照区

菜鸡一枚,如果有什么地方讲的不对,欢迎指出
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息