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。

原文地址:https://www.cnblogs.com/evilliu/p/8745634.html