zoukankan      html  css  js  c++  java
  • Hibernate学习——持久化类的学习

    A.概念

      持久化:将内存中的对象持久化(存储)到数据库的过程。Hibernate就是持久化的框架。

      持久化类:一个普通java对象与数据库的表建立了映射关系,那么这个类在Hiberna中被称为持久化类。(通俗一点就是java类+映射文件)

    B.持久化类的编写规则

      1.对持久化类提供一个无参构造方法。

        当然,如果你什么构造都不写,默认还是有无参的。提供无参构造是为了Hibernate底层能反射生成该持久化类的实例。

      2.属性需要私有,对私有属性提供public的get和set方法。

        由于底层创建了该持久化类的实例,Hibernate就要开始设置属性的值

      3.对持久化类提供一个唯一标识的OID,与数据库主键对应。

        java中通过对象地址值是否相同区分是否是同一个对象,数据库中通过主键确定是否是同一个记录。而在Hibernate中通过持久化类的OID属性来区分是否是同一对象

      4.持久化类的属性尽量使用包装类类型。

        比如基本数据类型如int,如果是0的话,可能是默认,也可能是数值,而改成包装类型的话,默认为空,0是数值等等

      5.持久化类不要使用final进行修饰。

        首先,用final修饰的类不能继承,而Hibernate中则有一个优化手段(延迟加载),通过返回一个代理对象来管理数据,Hibernate引入的javasist的jar包可以对没有实现接口的类产生代理,主要就是通过继承这个类来实现代理,如果不能被继承,延迟加载技术就失效,load和get方法就没区别了

    C.主键生成策略

      1.概念:

        在实际开发中,一般不允许用户手动设置数据库的主键(统一规范),所以将主键交给数据库,手动编程设置。Hibernate中为了减少程序的编写,提供了很多的主键生成策略

      2.主键的分类

      •   自然主键:主键的本身就是表中的一个字段。例子:比如人员表中,有人员姓名,身份证号属性。每个人都有自己的身份证,身份证号就是一个一个自然主键  
      •        代理主键:用了一个与该表不相关的字段,如id主键,这种主键叫做代理主键 

              一般用后面的代理主键。一旦自然主键参与业务逻辑编码中,后期变动可能需要修改源码。

      3.Hibernate中的主要生成策略

      •  Increment.   Hibernate中提供的自动增长机制,适用于short,int,long类型主键,在单线程程序使用,多线程会出错。首先发送一条语句 select max(id) from table,然后让id+1作为下一条记录的主键。
      •     Indentity .     适用于short,into,long类型主键,用的是数据库底层的自动增长机制。适用于有自己增长机制的数据库(mysql,mssql),注意oracle是没有自动增张机制  
      •    Sequence.    适用于short,int,long类型主键,用的是序列的方式,如oracle。
      •     Uuid              适用于字符串类型主键。适用Hibernate中随机方式生成的字符串主键。
      •  native           本地策略,可以再identify和sequence之间自动切换(一般就用这个就行了)
      •     assigned       Hibernate放弃外键管理,需要通过手动编写程序或者用户自己设置
      •     foreign           外部的。使用另外一个相关联的对象的主键作为该对象主键。主要用于一对一关系中。

    D.持久化类的三种状态。

      Hibernate为了更好的管理持久化类。将持久化类分为三种状态

      1.瞬时态(transient)

        对象没有唯一的标识OID,没有session管理。

        获取:

    Customer customer = new Customer()//对象刚开始创建,没有被赋值标识OID

        状态转化:

          瞬时——>持久  save()   saveOrUpdate(Object obj)

          瞬时——>脱管  customer.setId(1L);

       2.持久态(presistent)

        对象有唯一的标识OID。有session管理

        获得:get()   load()  

        状态转化:

          持久——>瞬时:delete()

          持久——>脱管 close(),clear() evict()(清除单个对象)

       3.脱管态(Detached)

          对象有唯一的标识OID,没有被session管理

        获取:(官网没有给如何直接获取,但是可以获取)

    Customer customer = new Customer();
    customer.setId(1L);

        状态转化:

           脱管——>持久:  update()    saveOrUpdate()

           脱管——>瞬时   setId(null);

    持久化对象的特性:

      自动跟新数据库:

        给持久化对象设置新的属性,先用get获取,再设置值,不用update,只要事务提交,也能更新数据库

       原理:Hibernate有一级缓存,会备份一份数据在Hibernate的快照区,当你在内存中改变持久化对象里面的属性值时候,会在提交后自动和快照区对比,不一样,更新数据库和快照区。(只有当你设置的值和数据库里面不一致的时候才自动更新)

    Customer cust = session.get(Customer.class,1L);
    cust.setName("张三");
    tx.commit()
  • 相关阅读:
    HDU 4053 or ZOJ 3541 The Last Puzzle【区间dp】【经典题】
    HDU 4053 or ZOJ 3541 The Last Puzzle【区间dp】【经典题】
    Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) 831C. Jury Marks【二分】【水题】
    Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) 831C. Jury Marks【二分】【水题】
    POJ 2955 Brackets 【区间dp】【水题】
    POJ 2955 Brackets 【区间dp】【水题】
    动手动脑2
    统计创建了多少类
    动手动脑1
    动手动脑
  • 原文地址:https://www.cnblogs.com/ends-earth/p/10774855.html
Copyright © 2011-2022 走看看