zoukankan      html  css  js  c++  java
  • 关于Hibernate中的临时态, 持久态, 游离态

    三态的基本概念:

    1, 临时状态(Transient):也叫自由态,只存在于内存中,而在数据库中没有相应数据。用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象;

     //创建一个瞬态对象
      User user = new User();
      user.setName(userName);
      user.setPassword("test");
      //user仍是一个瞬态对象
    • 1
    • 2
    • 3
    • 4
    • 5

    2, 持久化状态(Persistent):与session关联并且在数据库中有相应数据。已经持久化,加入到了Session缓存中。如通过hibernate语句保存的对象。处于此状态的对象叫持久对象;

     //创建一个瞬态对象
      User user = new User();
      user.setName(userName);
      user.setPassword("test");
      //user仍是一个瞬态对象
    
    Session session = sessionFactory.openSession();
    Tansaction tx = session.beginTansaction();
    //此时user仍是一个瞬态对象
    session.save(user);
    //此时user已变为持久态
    tx.commit();
    
    Tansaction tx2 = session.beginTansaction();
    user.setPassword("pdw");
    tx2.commit();
    //虽然在这个事物中并没有调用session的save()方法来保存user对象,但是usr处于持久太,
    //所以对user对象所做的任何修改都持久化到数据库中   ---------持久态自动更新
    //那么数据库中的密码也变成了pdw
    
    session.close();
    
    另一种方法直接得到持久态的对象:
    
    Session session = sessionFactory.openSession();
    Tansaction tx = session.beginTansaction();
    User user = (User) session.load(User.class,"key");   ------相当于hql  从DB读出来的 当然是持久态
    //user对象已是持久太对象
    tx.commit();
    session.close();
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    3, 游离状态(Detached):持久化对象脱离了Session的对象。如Session缓存被清空的对象。
    特点:已经持久化,但不在Session缓存中。处于此状态的对象叫游离对象;

    //创建一个瞬态对象
      User user = new User();
      user.setName(userName);
      user.setPassword("test");
      //user仍是一个瞬态对象
    
    Session session = sessionFactory.openSession();
    Tansaction tx = session.beginTansaction();
    //此时user仍是一个瞬态对象
    session.save(user);
    //此时user已变为持久态
    tx.commit();
    session.close();      clear()   evict()  3种变游离态
    user对象已经变成游离态
    
    session close完后,对象就变成游离态。
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    这里写图片描述
    游离对象和临时对象异同:

    两者都不会被Session关联,对象属性和数据库可能不一致;

    游离对象有持久化对象关闭Session而转化而来,在内存中还有对象所以此时就变成游离状态了;

    Hibernate和SQL的关系:

    在操作了hibernate的方法如save()等后,并没有直接生成sql语句,去操作数据库,而是把这些更新存入Session中,只有Session缓存要被更新时,底层的sql语句才能执行,数据存入数据库;

    下面举例说明:
    一,Session.save(user)运行机理。
    1,把User对象加入缓存中,使它变成持久化对象;
    2,选用映射文件指定的标识生成ID;
    3,在Session清理缓存时候执行:在底层生成一个insert sql语句,把对象存入数据库;

    注意:在你执行Session.save(user)后,在Session清理缓存前,如果你修改user对象属性值,那么最终存入数据库的值将是最后修改的值;此过程中ID不能被修改;

    二,Session.delete(user)运行过程。
    如果user是持久化对象,则执行删除操作,同样底层数据库的执行条件是:在Session清理缓存时候;
    如果user是游离对象:
    1,将user对象和Session关联,使之成为持久化对象;
    2,然后按照user 是持久化对象的过程执行;

    三态之间的转换方法:

    ①如何成为自由态?对象通过构造方法成为自由态;持久态和游离态则通过session的delete方法成为自由态

    ②如何成为持久态?对象可以由session的load或get方法直接成为持久态;自由态对象可以通过save,saveOrUpdate或persist方法成为持久态;游离态对象则可以通过update,saveOrUpdate成为持久态

    ③如何成为游离态?游离态只能由持久态转换而来,通过close或clear方法实现。

    几种转换方法的对比:

    1.get 与load

    都是从数据库中加载数据封装为java对象,使得java对象从自由态直接变为持久态;

    但是有两点区别:①get返回对象可以为null,load返回值则始终不为null,找不到时会抛异常②get即时执行insert,而load则是在使用此对象时才执行insert

    2.save,update与saveOrUpdate

    save是将自由态转为持久态,而update是将游离态转为持久态,saveOrUpdate可以说是两者的综合,它执行时先判断对象的状态(主要是通过有无主键判断的),若是自由态,则save,若是游离态,则update

    3.save与persist

    两者都是将对象由自由态转为持久态,但返回值不同:save返回主键值,而persist不返回

    4,saveOrUpdate与merge

    两者都是将自由态或游离态对象与数据库关联,但merge不改变对象的原有状态

    此外,对clear与flush方法也作介绍。clear是将session中的对象全部变为游离态,是对象由持久态变为游离态的一种方法(另外一种是关闭session);flush方法时为了使update操作能即时进行(正常情况下,只有在事务关闭时才进行update操作)。

  • 相关阅读:
    Thymeleaf 异常:Exception processing template "index": An error happened during template parsing (template: "class path resource [templates/index.html]")
    Java 异常 Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date'
    MySQL 查询字段时,区分大小写
    Oracle Database XE 11gR2 SQL 命令行的显示调整
    使用 PL/SQL Developer 导入 .sql 文件
    下载、安装 PL/SQL Developer
    安装、验证安装 Oracle Database XE 11gR2
    下载 Oracle Database XE 11gR2
    MyEclipse 设置打开 jsp 文件的默认编辑器
    Oracle Database XE 11gR2 自带的用户,新建用户,修改用户密码
  • 原文地址:https://www.cnblogs.com/DONGb/p/7844242.html
Copyright © 2011-2022 走看看