zoukankan      html  css  js  c++  java
  • 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操作)

  • 相关阅读:
    1026 Table Tennis (30)
    1029 Median
    1025 PAT Ranking (25)
    1017 Queueing at Bank (25)
    1014 Waiting in Line (30)
    1057 Stack (30)
    1010 Radix (25)
    1008 Elevator (20)
    字母大小写转换
    Nmap的基础知识
  • 原文地址:https://www.cnblogs.com/fudapeng/p/3845276.html
Copyright © 2011-2022 走看看