• JAVA框架:hibernate(二)


    一、事务操作。

    代码:

     1  @Test
     2     public void  tr_Up(){
     3         Session session=hibernateUtils.getSession();
     4         Transaction transaction=session.beginTransaction();
     5         Customer customer=new Customer();
     6         try {
     7             Customer c=session.get(Customer.class,1L);
     8             c.setName("ooop");
     9             //提交事务。
    10             transaction.commit();
    11         }catch (Exception ex)
    12         {
    13             transaction.rollback();
    14             ex.printStackTrace();
    15         }
    16         finally {
    17             session.close();
    18 
    19         }
    20 
    21     }

     分三部分:使用try catch finally来控制事务。try正常执行的代码 catch捕捉错误如果有错误,就回滚。finally最后释放资源。

    二、持久化类。

    持久化类就是java类,这个java类和表建立映射关系。就是持久化类。也就是说javabean+xx.hbm.xml(映射文件)组成了持久化类。

    持久化类的规则:

      1、提供一个无参数的构造器。

      2、提供一个标识属性,映射数据库主键字段。-- 唯一标识OID.数据库中通过主键.Java对象通过地址确定对象.持久化类通过唯一标识OID确定记录。

      3、所有属性提供public访问修饰,提供get或者set方法。

      4、标识属性应尽量使用基本数据类型的包装类。

    三、持久化类的状态:

      1、瞬时态:没有持久化标识:OID,没有被纳入session管理。

      2、持久态:被session管理,有持久化标识OID。

      3、托管态:有持久化标识OID,没有纳入session管理。

      三个状态转换:

        1. 瞬时态    -- 没有持久化标识OID, 没有被纳入到Session对象的管理
            * 获得瞬时态的对象
                * User user = new User()
            * 瞬时态对象转换持久态
                * save()/saveOrUpdate();
            * 瞬时态对象转换成脱管态
                * user.setId(1)
        
        2. 持久态    -- 有持久化标识OID,已经被纳入到Session对象的管理
            * 获得持久态的对象
                * get()/load();
            * 持久态转换成瞬时态对象
                * delete();  --- 比较有争议的,进入特殊的状态(删除态:Hibernate中不建议使用的)
            * 持久态对象转成脱管态对象
                * session的close()/evict()/clear();
        
        3. 脱管态    -- 有持久化标识OID,没有被纳入到Session对象的管理
            * 获得托管态对象:不建议直接获得脱管态的对象.
                * User user = new User();
                * user.setId(1);
            * 脱管态对象转换成持久态对象
                * update();/saveOrUpdate()/lock();
            * 脱管态对象转换成瞬时态对象
                * user.setId(null);
        
        4. 注意:持久态对象有自动更新数据库的能力!!!

    对持久化对象有自动更新数据库的能力理解:

     1     @Test
     2     public  void  Cjobj(){
     3         Session session=hibernateUtils.getSession();
     4         Transaction tr=session.beginTransaction();
     5 //        通过get方法,对象持久化。可以直接使用set方法来更新值。也就是持久化对象有更新数据库的能力。
     6         Customer c=session.get(Customer.class,4L);
     7         c.setName("cook");
     8 //        不需要update。也可以使用update进行更新。
     9         tr.commit();
    10         session.close();
    11     }
    12 }

    为什么获取持久化对象之后,持久化对象通过设置属性的(set方法)具有更改数据库的能力?

    这是因为session一级缓存的快照功能。

    快照功能图示:

    session缓存功能:

       1、什么是缓存,其实就是一块内存空间,将数据源(数据库或者文件)中的数据存放在缓存中,再次获取数据的时候

    直接缓存中获取,提升程序的性能!

        2:hibernate的提供两种缓存功能:

          session的一级缓存。自带不可以卸载,一级缓存的声明周期与session一致,一级缓存称为:session级别的缓存。

          二级缓存:默认没有开启,需要手动配置才可以使用,二级缓存其实加强一级缓存 ,提升其生命周期。二级缓存可以给多个session提供数据共享。二级缓存也叫做sessionfactory级别缓存。

        3、session缓存概述:

          session接口中,有一系列的java集合,这些java集合构成Session级别缓存(一级缓存)。将对象存入一级缓存。session没有结束生命周期

          那么对象在session中存放着。

          内存中包含session实例--->session的缓存(一些集合)--->集合中包换缓存对象!!!

    怎么证明session有缓存功能呢?

    通过2次查询,看日志输出的sql语句几次:

     1     @Test
     2     public  void  sessionMem(){
     3         Session session=hibernateUtils.getSession();
     4         Transaction tr=session.beginTransaction();
     5         Customer c=session.get(Customer.class,4L);
     6         System.out.println(c.getName());
     7         Customer c1=session.get(Customer.class,4L);
     8         System.out.println(c1.getName());
     9         tr.commit();
    10         session.close();
    11     } 

    结果:

    只有一次查询语句。说明第二次查询走的是session缓存。

    四、主键

    如果我们主键类型采用int、long、short类型可以使用:native。

    如果我们主键类型是:varchar、char的时候选择:uuid。

  • 相关阅读:
    window.open
    GetPostBackClientHyperlink
    引发和使用事件
    浅谈宝宝的教育及培养
    C#关键字之:base、this
    Ioc
    自定义input[type="radio"]的样式
    选择_冒泡_直接插入排序.md
    Tkinter.md
    从零开始学wordpress 之一
  • 原文地址:https://www.cnblogs.com/evilliu/p/8745634.html
Copyright © 2020-2023  润新知