美文网首页
hibernate之session接口

hibernate之session接口

作者: 墨线宝 | 来源:发表于2021-03-17 09:43 被阅读0次

原文链接http://zhhll.icu/2020/12/04/%E6%A1%86%E6%9E%B6/hibernate/session%E6%8E%A5%E5%8F%A3/

session接口

Session接口是hibernate向应用程序提供的操纵数据库的最主要的接口,提供了保存、更新、删除和加载Java对象的方法。

session具有一个缓存,位于缓存中的对象成为持久化对象,和数据库中的相关记录对应。session能够在某些时间点,按照缓存中对象的变化来执行相关的SQL语句,来同步更新数据库,这一过程称为刷新缓存(flush)。

hibernate把对象分为4种状态,持久化状态,临时状态,游离状态,删除状态。session的特定方法可以使对象进行状态转换

session缓存

session实例没有结束生命周期,且没有清理缓存,则存放在session缓存中的对象也不会结束生命周期,session缓存可以减少访问数据库的频率。

操作session缓存

flush方法

缓存中对象同步到数据库(会插入或更新数据库),使数据库中的状态与缓存中一致

注意:

session在以下情况下会刷新缓存

  • hibernate在事务提交之前会执行flush()方法,然后再向数据库提交事务

  • 显示调用session.flush()方法

  • 在执行HQL或者QBC查询,会先进行flush()操作,以得到数据表最新的记录

refresh方法

将数据库同步到缓存中(会查询数据库),使缓存中的状态与数据库一致

session.refresh(); 
clear方法

清理缓存,可以将session中的缓存清除

session.clear();

四种状态的转换

临时状态(Transient)

  • 在使用代理主键的情况下,OID通常为null
  • 不处于session缓存中
  • 在数据库中也没有对应的记录

持久化状态(Persist)

  • OID不为null
  • 位于session缓存中
  • 若在数据库中已经有和其对应的记录,持久化对象和数据库中的相关记录对应
  • session在flush缓存时,会根据持久化对象的属性变化,来同步数据库
  • 在同一个session实例的缓存中,数据库表中每条记录只对应唯一的持久化对象
  • 持久化对象的id不可以被修改,因为hibernate是根据id去进行比较的

删除状态(Removed)

  • 在数据库中没有和其OID对应的记录
  • 不再处于session缓存中

游离状态(Detached)

  • OID不为null
  • 不再处于session缓存中
  • 一般情况下,游离对象是由持久化对象转变过来的,数据库中可能还存在它对应的记录
在这里插入图片描述

save方法和persist方法的区别

在调用persist()方法时如果存在id,则会抛出异常,而save方法则可以正常执行

org.hibernate.PersistentObjectException: detached entity passed to persist

get方法和load方法的区别

  • 执行get方法会立即加载对象,执行load方法若不使用该对象,则不会立即查询,而是返回一个代理对象(延时加载)

  • 若数据表中没有对应的记录,get方法返回null,load方法抛出异常

    org.hibernate.ObjectNotFoundException: No row with the given identifier exists
    
  • load方法可能会抛出懒加载异常

    org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    

注意:在session缓存中不能够有两个相同OID的对象,否则会报异常

public static void testOid(Session session){
  User user = (User) session.get(User.class,1);
  System.out.println(user);
  User user1  = new User();
  user1.setId(1);
  user1.setName("王五");
  session.saveOrUpdate(user1);
}

org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session

evict方法

从session缓存中将指定的持久化对象移除

hibernate获取原生JDBC连接进行操作

可以使用doWork或者doReturnWork来使用原生JDBC操作数据

session.doWork(new Work() {
  @Override
  public void execute(Connection connection) throws SQLException {

  }
});

session.doReturningWork(new ReturningWork<Object>() {
  @Override
  public Object execute(Connection connection) throws SQLException {
    return null;
  }
});

由于本身的博客百度没有收录,博客地址http://zhhll.icu

相关文章

  • Hibernate之session接口

    session接口是hibernate重要的组成,session接口的实现中包含一系列java集合,这些集合构成...

  • hibernate之session接口

    原文链接http://zhhll.icu/2020/12/04/%E6%A1%86%E6%9E%B6/hibern...

  • hibernate的核心类有那些

    hibernate的核心类有那些? Hibernate的核心接口一共有5个,分别为:Session、Session...

  • Hibernate_2 Session及Session API

    Session 介绍 Session 接口是 Hibernate 向应用程序提供的操纵数据库的最主要的接口, 它提...

  • Hibernate之session接口(二)

    1.对象的几种状态 在所有之前,说明一下,对于hibernate,它的对象有三种状态,transient、pers...

  • HIbernate第二次课

    1、Hibernate接口 访问数据库操作的接口:Session、Transaction、Query 配置Hibe...

  • Hibernate学习3(Session概述与方法)

    Session概述: Session接口是hibernate向应用程序提供的操作数据库的主要接口 它提供基本的保存...

  • hibernate

    hibernate默认不提交事务 hibernate有2级缓存 session.save() session.sa...

  • Hibernate Session

    Session接口是Hibernate向应用程序提供的操纵数据库的主要接口,它提供了基本的保存,更新,删除和加载J...

  • Hibernate

    hibernate简介Hibernatehibernate简介hibernate快速入门session查询api实...

网友评论

      本文标题:hibernate之session接口

      本文链接:https://www.haomeiwen.com/subject/alescltx.html