• hibernate 持久化对象的生命周期


    包括三种状态:瞬态(自由态),持久态,托管态(游离态)

    自由态

    持久化对象的自由态,指的是对象在内存中存在,但是在数据库中并没有数据与其关联。

    持久态

    持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象的变化将会被同步到数据库中。

    游离态

    处于持久态的对象,在其对应的Session实例关闭后,此时对象进入游离态。也就是说Session实例是持久态对象的宿主环境,一旦宿主环境失效,那么持久态对象迚入游离状态。

    session.beginTransaction(); 
    User user = new User(); // 自由态
    user.setUserName("James"); 
    user.setUserPwd("123"); 
    System.out.println(user.getId()); //id不存在
    Integer id = (Integer) session.save(user); //返回对应数据库中的id
    user.setUserPwd("456"); 
    session.getTransaction().commit(); // 持久态 → 游离态
    System.out.println(user.getId()); // id存在 
    
    Session session2 = HibernateUtil.getSessionFactory().getCurrentS
    session2.beginTransaction(); 
    user.setUserPwd("789"); 
    session2.update(user); // 游离态 → 持久态
    session2.getTransaction().commit();

    游离态和自由态区别

    1. 区别就在于游离态对象可以再次与Session迚行关联而成为持久态对
    象。

    2. 自由态对象在数据库中没有数据与其对应,但是游离态对象在数据库
    中有数据与其对应,只不过当前对象不在Session环境中而已。从对
    象的是否有主键值可以做简单的判断。

                三种状态的改变

    load和get方法

    • get和load方法都是利用对象的主键值获取相应的对象,并可以使对象处于持久状态。

    • load方法获取对象时不会立即执行查询操作,而是在第一次使用对象是再去执行查询操作。如果查询的对象在数据库中不存在,load方法返回值不会为null,在第一次使用时抛出org.hibernate.ObjectNotFoundException异常。

    • 使用get方法获取对象时会立即执行查询操作,并且对象在数据库中不存在时返回null值。

    save和persist方法

    • save和persist方法都是将持久化对象保存到数据库中
    • sava方法成功执行后,返回持久化对象的ID
    • persist方法成功执行后,不会返回持久化对象的ID,persist方法是JPA中推荐使用的方法

    save和update方法

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

    update和saveOrUpdate方法

    • 如果一个对象是游离态或持久态,对其执行update方法后会将对象的修改同步到数据库中,如果该对象是自由态,则执行update方法是没有作用的。

    • 在执行saveOrUpdate方法时该方法会自动判断对象的状态,如果为自由态则执行save操作,如果为游离态或持久态则执行update操作。

    update和merge方法

    • 如果持久化对象在数据库中存在,使用merge操作时迚行同步操作。如果对象在数据库不存在,merge对象则迚行保存操作。

    • 如果对象是游离状态,经过update操作后,对象转换为持久态。但是经过merge操作后,对象状态依然是游离态。

    saveOrUpdate和merge方法

    saveOrUpdate方法和merge方法的区别在于如果session中存在两个主键值相同的对象,进行saveOrUpdate操作时会有异常抛出。这时必须使用merge迚行操作。

    clear方法和flush方法

    clear方法是将Session中对象全部清除,当前在Session中的对象由持久态转换为游离态。flush方法则是将持久态对象的更改同步到数据库中。(在事务提交之前进行flush操作)

  • 相关阅读:
    关于跨域策略文件crossdomain.xml文件
    fl.motion SDK包下载,可用来设置显示对象的连读、饱和度、色调、对比度
    ActionScript工程如何使用Flash CS的fl包中的UI组件(转)
    无法将 flash.display::BitmapData 转换为 flash.display.Bitmap
    服务器托管
    男人会为女人改变多少
    AS3组件之Slider滑块拖动条
    jQuery验证使用
    十进制、十六进制、二进制习题
    jQuery层次选择器
  • 原文地址:https://www.cnblogs.com/fudapeng/p/3845276.html
Copyright © 2020-2023  润新知