JAVAEE框架学习——Hibernate——持久化

Hibernate持久化类的编写规则

持久化类

Hibernate是持久层的ORM映射框架,专注于数据的持久化操作。持久化就是将内存中的数据永久存储到关系型数据库中。所谓的持久化类指的是一个Java类与数据库表建立了映射关系。这个类就称为持久化类

持久化类的编写规则

  • 持久化类需要提供无参构造方法。在Hibernate底层使用反射生成类的实例
  • 持久化类的属性需要私有,对私有属性提供公有的get和set方法,在Hibernate底层会将查询到的数据进行封装,所以需要提供公有的get和set方法
  • 持久化类的属性要尽量使用包装类的类型。因为包装类和基本数据类型的默认值不同。包装类的类型语义描述更清晰而基本数据类型不容易描述
  • 持久化类要有一个唯一标示OID与表的主键对应。Hibernate中需要通过这个唯一标识OID区分在内存中是否是同一个持久化类。没有主键的表无法映射到Hibernate中。
  • 持久化类尽量不要使用final进行修饰。Hibernate中有延迟加载的机制,这个机制中会产生代理对象,Hibernate产生代理对象使用的是字节码的增强技术完成的。其实就是产生了当前类的一个子类对象实现的。

主键类型

  • 自然主键
    具有业务含义的字段作为主键,称之为自然主键。表的业务列中,有某业务列符合,必须有,并且不重复的特征时,该列可以作为主键使用。
  • 代理主键
    不具备业务含义的字段作为主键,称之为代理主键。

主键生成策略

   <id name="cust_id">
            <!--generator 主键生成策略,每条记录录入时,主键的生成规则
            identity:主键自增 由数据库来维护主键值,录入时不需要指定主键
            increment:主键自增 由hibernate来维护,每次插入前会先查询表中id最大值。最大值+1作为新主键值
                        存在线程安全问题,在并发访问的时候会产生数据问题
            sequence:Oracle中的主键生成策略。
            hilo:高低位算法,主键自增,由Hibernate来维护
            native:hilo+sequence+identity 三选一策略。根据数据库对自动生成表示符的能力来选择
            uuid:产生随机字符串作为主键主键类型必须为String类型
            assigned:自然主键生成策略。由用户自己手动自定id值,hibernate不会管理主键值,由开发人员自己录入
            -->
            <generator class="increment"></generator>
        </id>

持久化对象的状态

Hibernate中持久化分为三种状态:瞬时态、持久态、托管态

瞬时态

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

  • 没有id
  • 没有与session关联

持久态

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

  • 有id
  • 与session关联

脱管态

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

  • 有id
  • 与session关联
  //获得session
        Session session = HibernateUtils.openSession();
        //打开事物
        Transaction transaction = session.beginTransaction();
        //执行操作
        Customer customer = new Customer(); //没有id 没有与session关联=>瞬时状态
        customer.setCust_name("联想");//瞬时态
        session.save(customer);//持久化状态 有id 有session关联
        //提交事物
        transaction.commit();
        //关闭资源
        session.close();//脱管状态 游离态 有id 没有session关联

三种状态特点:

  • save()方法:不能理解为保存,要理解为将瞬时状态转化为持久化状态的方法

持久化状态特点

持久化状态对象的任何变化都会自动同步到数据库中

对象状态的转换

  • 当一个个对象被执行new关键字创建后,该对象处于瞬时状态
  • 当对瞬时状态对象执行Session的save()或saveOrUpdate()方法后,该对象将被放入Session的一级缓存,对象会进入持久状态
  • 当对持久态对象执行evict()、close()或clear()操作后,对象进入脱管状态
  • 当直接执行Session的get()、load()、find()或iterate()等方法从数据库里查询对象时,查询到的对象也处于持久状态。
  • 当对数据库中的记录进行update()、saveOrUpdate()以及lock()等操作后,此时脱管态的对象就过渡到持久态,由于瞬时态和脱管态的对象不再session的管理范围,所以会在一段时间后被jvm回收
    持久化对象的三种状态可以通过调用session中的一系列方法实现状态间的转换:

1.瞬时态转换到其他状态

  • 瞬时态转换为持久态:执行Session的save()或saveOrUpdate()方法
  • 瞬时态转换为脱管态:为瞬时态对象设置持久化标识OID。瞬时态和脱管态没有与Session进行关联,所以脱管态和瞬时态的区别就是OID有没有值,所以可以为瞬时状态对象设置OID,使其变为脱管状态对象

2.持久态对象转换到其他状态

  • 持久态转换为瞬时态:执行Session的delete()方法,被删除的持久化对象不建议再次使用
  • 持久态转换为脱管态:执行Session的evict()、close()或clear()方法。evict()方法用于清除一级缓存中某一个对象;close()方法用于关闭Session,清除一级缓存;clear()方法用于清除一级缓存的所有对象

3.脱管态对象转换到其他状态

脱管态对象无法直接获得,是由其他状态对象转换而来的,脱管态对象转换到其他状态总结:

  • 脱管态转换为持久态:执行session的update()、saveOrUpdate()或lock()方法
  • 脱管态转换为瞬时态:将脱管态对象的持久化标识OID设置为null。
持久化对象转换

Hibernate的一级缓存 快照

缓存的作用:提高效率,提高数据库的操作效率


缓存原理图
快照原理图

一级缓存和对象状态的关系

对象的三种状态用缓存的角度来解释:

  • 瞬时状态:没有id 没有在session缓存中
  • 持久化状态:有id,在session缓存中
  • 游离态:有id,没有在session缓存中
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • 本文包括:1、Hibernate的持久化类2、Hibernate 持久化对象的三个状态(难点)3、Hibernat...
    廖少少阅读 1,444评论 0 13
  • 1.主键生成策略 1.1 主键的两种类型 自然主键:把数据表中的某一业务字段作为表的主键。如一张用户表中,把用户的...
    Wizey阅读 542评论 0 3
  • 1.OID和主键生成策略 1.1.主键(Primary key): 在数据库表中能够唯一识别每一行记录的一个字段或...
    贾里阅读 1,125评论 0 0
  • 双十一买的快递陆陆续续到了 匆匆忙忙买的手表因为是链表,大了一圈,需要拿几截下来,可是根本不好拿,弄了好久 和我妈...
    暮色言落阅读 151评论 0 0
  • 吉祥福富贵福。值此元旦 佳节把五福送给诸位。 新年伊始庆元旦 翘首迎福众期盼 身体健康福气好 合家欢乐祝平安 事业...
    冷__泠阅读 285评论 0 1