zoukankan      html  css  js  c++  java
  • hibernate 持久化对象的生命周期

    持久化对象的生命周期

    瞬态(自由态)
    表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象
    持久态
    持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象的变化将会被同步到数据库中
    session.save() .....到..session.getTransaction().commit();这个过程
    托管态(游离态
    提交之后的状态
    处于持久态的对象,在其对应的Session实例关闭后,此时对象进入游离态。也就是说Session实例是持久态对象的
    宿主环境,一旦宿主环境失效,那么持久态对象进入游离状态

    游离态和自由态的区别:

    1 游离态对象可以再次与Session进行关联而成为持久态对象。
    2 自由态对象在数据库中没有数据与其对应,但是游离态对象在数据库中有数据与其对应,只不过当前对象不在
    Session环境中而已。从对象的是否有主键值可以做简单的判断。

    User user = new User();
        user.setUsername("tom");
        // 自由态的时候还是没有id的
        Session session = HibernateUtil.getSession();
        
        session.beginTransaction();
        session.save(user);    
        
        session.getTransaction().commit();
        syso(user.getId());
        
        
        //执行save之后关闭session,这个时候就已经有id了

    load和get方法

    1 get和load方法都是利用对象的主键值获取相应的对象,并可以使对象处于持久状态。
    2 延迟加载...load方法获取对象时不会立即执行查询操作,而是在第一次使用对象是再去执行查询
    操作。使用时有范围的,要在session的关闭之前,因为使用的时候才回去查,就要有session
    如果查询的对象在数据库中不存在,load方法返回值不会为null,在第一次使用
    时抛出org.hibernate.ObjectNotFoundException异常。
    3 使用get方法获取对象时会立即执行查询操作,并且对象在数据库中不存在时返回null值。

    Session session = HibernateUtil.getSession();
        
        session.beginTransaction();
            User user = (user)session.get(User.class,1);
            //这个时候执行了select方法  
            syso(user == null);// 当user不存在时输出true
        session.getTransaction().commit();
    Session session = HibernateUtil.getSession();
        
        session.beginTransaction();
            User user = (user)session.load(User.class,1);
            //这个时候不会执行select方法 当使用的时候
            //syso(user.getUsername())才会去查询
            syso(user == null);/* 当user不存在时false,永远都不会是null,因为有user的代理对象
            ,第一次使用的时候会出现异常*/
        session.getTransaction().commit();

     save和persist方法

    1 save和persist方法都是将持久化对象保存到数据库中
    2 save方法成功执行后,返回持久化对象的ID
    3 persist方法成功执行后,不会返回持久化对象的ID,persist方法是JPA中推荐使用的方法
      hibernate是JPA的一种实现

    save和update方法


    save方法是将自由态的对象进行保存
    update方法是将游离态的对象进行保存

    update和saveOrUpdate方法


    如果一个对象是游离态或持久态,对其执行update方法后会将对象的
    修改同步到数据库中,如果该对象是自由态,则执行update方法是没有作用的
    在执行saveOrUpdate方法时该方法会自动判断对象的状态,如果为
    自由态则执行save操作,如果为游离态或持久态则执行update操作

    update和merge方法

    如果持久化对象在数据库中存在,使用merge操作时进行同步操作。
    如果对象在数据库不存在,merge对象则进行保存操作
    如果对象是游离状态,经过update操作后,对象转换为持久态。
    但是经过merge操作后,对象状态依然是游离态

    自由态交给merge就是insert
    游离态交给merge就是update,但是之前会根据id去数据库查询一下

      clear 和 flush

    clear方法是将Session中对象全部清除,当前在Session中的对象
    由持久态转换为游离态。flush方法则是将持久态对
    象的更改同步到数据库中。

    session.flush()方法的作用其实就是让session的缓存的数据(session就是一级缓存)刷入到数据库里面去,让数据库同步,你可以更简单的理解就是,强制让session的数据和数据库的数据同步,而不是什么清除缓存,我就奇怪了,清除缓存明明是session.clear()方法,在使用flush方法一般之前都是对一个对象进行CRUD的操作,然后你调用flush方法,就及时的同步到数据库里面去,其实session.flush()方法用的最好的一块是在处理大量数据的时候我们可以控制数量,比如,我们要存储1万个对象,我们可以这样做

    if(i%20==0){

    session.flush();//强制同步数据到数据库里面去

    session.clear();清除缓存

    }

    这样提高工作性能。

  • 相关阅读:
    华为EC169在MAC 10.9.6下的安装方法
    sqlmap用户手册 | WooYun知识库
    光纤光猫连接自己路由器的设定
    C# 里窗体里(windows form)怎么播放音乐
    让我们写的程序生成单个的exe文件(C#winform程序举例)
    Basic EEG waves 四种常见EEG波形
    Hemodynamic response function (HRF)
    Parseval's theorem 帕塞瓦尔定理
    Typical EEG waveforms during sleep 睡眠状态下的几种典型EEG波形
    EEG preprocessing
  • 原文地址:https://www.cnblogs.com/itliucheng/p/4462619.html
Copyright © 2011-2022 走看看