(七)Hibernate Java对象持久化层的状态
一、概述
-临时状态:刚用new语句创建对象,还没有被持久化,并且不处于Session缓存中。处于临时状态的java对象被称为临时对象。
-持久化状态:已经被持久化,并且加入到Session的缓存中。处于持久化状态的java对象被成为持久化对象。
-游离状态:已经被持久化,但不再处于Session的缓存中。处于游离状态的java对象被成为游离对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 临时对象的特征: -OID为 null -不处于Session的缓存中,也可以说,不被任何一个Session实例关联 -在数据库中没有对应的记录 持久化对象的特征: -OID不为 null -位于一个Session实例的缓存中,持久化对象总是被一个Session实例关联 -持久化对象和数据库中的相关记录对应 -会根据持久化对象的属性变化,同步更新数据库。 User user=(User)session.get(User. class , 1 ); //获取持久化对象 持久状态 user.setName( "jerry" ); transaction.commit(); 我们发现我们没有执行update语句,却打印了update语句。Hibernate会自动将持久化对象的状态同步到数据库中。 游离对象的特征: -OID不为 null -不再位于Session的缓存中,也可以说,游离对象不被Session关联 -数据库中有对应的记录 |
例子:
1 2 3 4 5 6 7 8 9 10 11 12 | //对象状态转换的过程 Transaction ts=session.beginTransaction(); User user = new User(); //临时状态 user.setName( "tom" ); user.setPassword( "123456" ); session.save(user); //转变为持久化状态 ts.commit(); //持久化状态 session.close(); //转变为游离状态 sessionfactory.close(); System.out.println(user.getName()); //游离状态 |
二、三种状态的转换
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 31 32 33 34 35 36 37 | 1 )临时状态转换持久化状态 -Session的save()方法会将临时状态转换成持久状态。 把要保存的对象放入Session缓存中,使它进入持久化状态。使用映射文件指定的主键生成策略,为持久化对象分配唯一OID。 save方法只是为对象分配UID。我们可以在save方法处打断点。 当我们的主键生成策略为 native 时,由于我们使用mysql数据库,主键自增,所以执行完save方法后,打印insert语句,mysql数据库为我们对象自增OID 当我们的主键生成策略为incrementt时,increment是由Hibernate维护,先去表中查最大ID然后+ 1 ,我们执行完save方法之后,发现打印select查找最大id的语句,执行commit时才打印插入语句 2 )临时状态转换成游离状态 -将临时状态的对象OID设置为数据库中对应的记录. User user= new User(); user.setId( 1 ); 3 )持久化状态转换成临时状态 第一种: User user=(User)session.get(User. class , 1 ); //获取持久化对象 持久状态 session.close(); //游离状态 user.setId( null ); //临时状态 第二种: User user=(User)session.get(User. class , 1 ); //获取持久化对象 持久状态 session.evict(user); //游离状态,此方法会将session缓存中清除持久化对象,使其变为游离状态 user.setId( null ); //临时状态 4 )持久化状态转换成游离状态 第一:调用session的close方法,持久化状态变为游离状态 第二: 调用session的evict()方法方法,将持久状态转变为游离状态 5 )游离状态转换成临时状态 只需要将游离状态的对象OID变为 null 。 6 )游离状态转换成持久状态 Session的update()方法使游离状态转换成持久状态。 User user=(User)session.get(User. class , 1 ); //获取持久化对象 持久状态 session.evict(user); //游离状态,此方法会将session缓存中清除持久化对象,使其变为游离状态 session.update(user); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步