Hibernate Session详解

Session接口是hibernate中的核心接口,它不是javaweb应用中的HttpSession接口

Session概述 

Session接口是Hibernate向应用程序提供的操纵数据库的主要接口,它提供了实现基本的保存、更新、删除和加载java对象的方法Session缓存

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


Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存。 只要 Session 实例没有结束生命周期, 且没有清理缓存,则存放在它缓存中的对象也不会结束生命周期。

Session 缓存可减少 Hibernate 应用程序访问数据库的频率。

什么是session的生命周期?

session = sessionFactory.openSession();
session.close();

Session缓存示例:

public class HibernateTest {

private SessionFactory sessionFactory;
	
	private Session session;
	
	private Transaction transaction;
	
	/**
	 * 初始化Hibernate
	 */
	@Before
	public void init(){
		/**
		 * 方法一:我们使用Configuration来加创建SessionFactory
		 */
//		Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
//		sessionFactory = cfg.buildSessionFactory();
		
		/**
		 * 方法二: 利用服务注册的方式创建sessionFactory
		 */
		final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
				.configure()
				.build();
		
		sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
		
		session = sessionFactory.openSession();
		transaction = session.beginTransaction();
		
	}
	
	/**
	 * 关闭Hibernate连接
	 */
	@After
	public void destory(){
		transaction.commit();
		session.close();
		sessionFactory.close();
	}
	
	/**
	 * session缓存的示例
	 * 只向数据库发送一条SQL语句。user和user1均对应的是user对象。
	 */
	@Test
	public void testSessionCache(){
		/**
		 * select * from user where id=1;
		 */
		User user = session.get(User.class, 1);
		System.out.println(user);
		
		User user1 = session.get(User.class, 1);
		System.out.println(user1);
		
		System.out.println(user == user1);
	}}

操作Session缓存的方法

flush方法

Session 按照缓存中对象的属性变化来同步更新数据库

扫描二维码关注公众号,回复: 4156623 查看本文章

默认情况下 Session 在以下时间点刷新缓存:

1:显式调用 Session flush() 方法

2:当应用程序调用 Transaction commit()方法的时, 该方法先 flush ,然后在向数据库提交事务

3:当应用程序执行一些查询(HQL, Criteria)操作时,如果缓存中持久化对象的属性已经发生了变化,会先 flush 缓存,以保证查询结果能够反映持久化对象的最新状态

flush 缓存的例外情况:

如果对象使用 native 生成器生成 OID(Object ID), 那么当调用 Session save() 方法保存对象时, 会立即执行向数据库插入该实体的 insert 语句。

commit() flush() 方法的区别:

flush 执行一系列 sql 语句,但不提交事务;commit 方法先调用flush() 方法,然后提交事务. 意味着提交事务意味着对数据库操作永久保存下来。

@Test
public void testSessionFlush(){
		User user = session.get(User.class, 1);
		user.setName("南城同学");
		session.flush();
		
//		User user1 = (User) session.createCriteria(User.class).uniqueResult();
//		System.out.println(user1);
	}

reflesh方法

refresh()会强制发送select语句,以使session缓存中的对象状态和数据库表中的记录保持一致

@Test
	public void testRefresh(){
		User user = session.get(User.class, 1);
		System.out.println(user);
		session.refresh(user);
		System.out.println(user);
	}

clear方法

清除session缓存

@Test
	public void testClear(){
		User user = session.get(User.class, 1);
		session.clear();
		User user1 = session.get(User.class, 1);
		System.out.println(user == user1);
	}

那么最后的比较将是false

持久化状态

站在持久化的角度, Hibernate 把对象分为 4 种状态: 持久化状态, 临时状态, 游离状态, 删除状态. Session 的特定方法能使对象从一个状态转换到另一个状态。

临时对象(Transient:

在使用代理主键的情况下, OID 通常为 null

不处于 Session 的缓存中

在数据库中没有对应的记录

@Test
	public void testSave(){
		User user = new User();
		user.setName("Tom_iii");
		user.setAccount(new BigDecimal(600));
		user.setCreateTime(new Date());
		System.out.println(user);  //临时对象
		session.save(user);
		System.out.println(user);  //持久化对象
		
		/**
		 * 持久化对象的ID是不能被修改的
		 */
//		user.setId(7);
	}

持久化对象(也叫”托管”)Persist):

OID 不为 null

位于 Session 缓存中

若在数据库中已经有和其对应的记录, 持久化对象和数据库中的相关记录对应

Session flush 缓存时, 会根据持久化对象的属性变化, 来同步更新数据库

在同一个 Session 实例的缓存中, 数据库表中的每条记录只对应唯一的持久化对象

	/**
	 * persist() : 也会执行insert语句
	 */
	@Test
	public void testPersist(){
		User user = new User();
		user.setName("Tom");
		user.setAccount(new BigDecimal(600));
		user.setCreateTime(new Date());
		System.out.println(user);  //临时对象
		session.persist(user);
		System.out.println(user);  //持久化对象
	}

删除对象(Removed)

在数据库中没有和其 OID 对应的记录

不再处于 Session 缓存中

一般情况下, 应用程序不该再使用被删除的对象

@Test
	public void testDelete(){
		User user = session.get(User.class, 4);
		session.delete(user);
		System.out.println(user);
	}

游离对象(也叫”脱管”) Detached):

OID 不为 null

不再处于 Session 缓存中

一般情况需下, 游离对象是由持久化对象转变过来的, 因此在数据库中可能还存在与它对应的记录

 close()、commit()、clear()

Session的常用方法

 Save()方法

Save()方法是用来保存持久化对象,进而在数据库中新增一条数据的方法。

Session save() 方法使一个临时对象转变为持久化对象

Session save() 方法完成以下操作:

user 对象加入到 Session 缓存中, 使它进入持久化状态

计划执行一条 insert 语句:在 flush 缓存的时候

Hibernate 通过持久化对象的 OID 来维持它和数据库相关记录的对应关系. user 对象处于持久化状态时, 不允许程序随意修改它的 ID

persist() save() 区别:

当对一个 OID 不为 Null 的对象执行 save() 方法时, 会把该对象以一个新的 oid 保存到数据库中;  但执行 persist() 方法时会抛出一个异常

 Get()load()方法

都可以根据跟定的 OID 从数据库中加载一个持久化对象

区别:

当数据库中不存在与 OID 对应的记录时, load() 方法抛出 ObjectNotFoundException 异常, get() 方法返回 null

两者采用不同的延迟检索策略:load 方法支持延迟加载策略。而 get 不支持。

Update()方法

Session update() 方法使一个游离对象转变为持久化对象, 并且计划执行一条 update 语句.

update() 方法关联一个游离对象时, 如果在 Session 的缓存中已经存在相同 OID 的持久化对象, 会抛出异常

update() 方法关联一个游离对象时, 如果在数据库中不存在相应的记录, 也会抛出异常.

1.3.4 saveOrUpdate()方法

Session saveOrUpdate() 方法同时包含了 save() update() 方法的功能

1.3.5 Delete()方法

Session delete() 方法既可以删除一个游离对象, 也可以删除一个持久化对象

Session delete() 方法处理过程

计划执行一条 delete 语句

把对象从 Session 缓存中删除, 该对象进入删除状态.

 Hibernate调用存储过程

Work 接口: 直接通过 JDBC API 来访问数据库的操作

 

Session doWork(Work) 方法用于执行 Work 对象指定的操作, 即调用 Work 对象的 execute() 方法. Session 会把当前使用的数据库连接传递给 execute() 方法.












猜你喜欢

转载自blog.csdn.net/aoshiyunlong/article/details/79610774