Session接口是Hibernate向程序提供操纵数据库的最主要接口,是单线程对象,它提供了基本的保存、更新、删除和查询方法。它有一个缓存,保存了持久化对象,当清理缓存时,按照这些持久化对象同步更新数据库。

注意:session的某些方法(persist,load)不会立即把改动写入数据库,而是缓存到session的一级缓存中,除非显示调用flush,或者关闭session时才会更新到数据库

  1. 临时状态(Transient):没与session关联
  2. 持久化状态(Persistent):与session关联,没close
  3. 游离状态(Detached):当session.close后

Session的方法详解

1.保存

save:立即插入数据库,并且返回主键

persist:不立即(延迟)插入数据库,无返回值

2.获取

load:加载对象后,对对象的改动不会立即刷新到db,必须flush到db

ex: User user=session.load(User.class,2);

user.setName('gt');

user.flush();   (延迟加载)

get:加载对象后,对对象的改动立即刷新到db

3.更新

update:持久化对象,更新

saveOrUpdate:包含save()和update()功能,如果传入的参数是临时对象(没有保存过)就调用save()方法;如果传入的参数是游离对象,就调用update()方法

merge:不会持久化对象,只会把托管对象的修改更新到db

4.删除

delete:从数据库中删除与JAVA对象对应的记录

5.清理

flush:把缓存同步到db

clear:清除session的缓存大小(更新批量时,应考虑)

三种状态的转换关系

下面通过实例讲解:

实体:

package cn.itcast.h_session_method;

public class User {
private Integer id;
private String name;
private byte[] data = new byte[1024 * 1024 * 5]; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }

映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.itcast.h_session_method"> <!--
lazy属性:默认为true,默认可以懒加载。
-->
<class name="User" table="user" lazy="true">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"/>
</class> </hibernate-mapping>

配置文件:hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!--数据库连接设置 -->
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/mytest
</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property> <!-- 方言 -->
<property name="dialect">
org.hibernate.dialect.MySQL5Dialect
</property> <!-- 控制台显示SQL -->
<property name="show_sql">true</property> <!-- 自动更新表结构 -->
<property name="hbm2ddl.auto">update</property>
<mapping resource="cn/itcast/h_session_method/User.hbm.xml" /> </session-factory> </hibernate-configuration>

测试文件

package cn.itcast.h_session_method;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test; import com.java1234.util.HibernateSessionFactory; public class App { private static SessionFactory sessionFactory = HibernateSessionFactory.getSessionFactory(); // save():把临时状态变为持久化状态(交给Sessioin管理)
// 会生成:insert into ...
@Test
public void testSave() throws Exception {
Session session = sessionFactory.openSession();
session.beginTransaction();
// -------------------------------------------- User user = new User(); // 临时状态
user.setName("test");
session.save(user); // 变为了持久化状态 // --------------------------------------------
session.getTransaction().commit();
session.close(); user.setName("李四"); // 游离状态
System.out.println(user.getName()); // 游离状态
} // update():把游离状态变为持久化状态
// 会生成:update ...
// 在更新时,对象不存在就报错
@Test
public void testUpdate() throws Exception {
Session session = sessionFactory.openSession();
session.beginTransaction();
// -------------------------------------------- User user = (User) session.get(User.class, 1);
System.out.println(user.getName()); // 持久化状态 // session.clear(); // 清除Session中所有的对象
session.evict(user); // 清除Session中一个指定的对象 user.setName("newname3");
session.update(user);
System.out.println("----");
// session.flush(); // 刷出到数据库 // --------------------------------------------
session.getTransaction().commit(); //
session.close();
} // saveOrUpdate():把临时或游离状态转为持久化状态
// 会生成:insert into 或 update ...
// 在更新时,对象不存在就报错
// 本方法是根据id判断对象是什么状态的:如果id为原始值(对象的是null,原始类型数字是0)就是临时状态,如果不是原始值就是游离状态。
@Test
public void testSaveOrUpdate() throws Exception {
Session session = sessionFactory.openSession();
session.beginTransaction();
// -------------------------------------------- User user = new User();
user.setId(3); // 自己生成一个游离状态对象
user.setName("newName"); session.saveOrUpdate(user); // --------------------------------------------
session.getTransaction().commit();
session.close();
} // delete():把持久化或游离转为删除状态
// 会生成:delete ...
// 如果删除的对象不存在,就会抛异常
@Test
public void testDelete() throws Exception {
Session session = sessionFactory.openSession();
session.beginTransaction();
// -------------------------------------------- // User user = (User) session.get(User.class, 2); // 持久化 User user = new User();
user.setId(300); session.delete(user);
session.flush(); System.out.println("---"); // --------------------------------------------
session.getTransaction().commit();
session.close();
} // get():获取数据,是持久化状态
// 会生成:select ... where id=?
// 会马上执行sql语句
// 如果数据不存在,就返回null
@Test
public void testGet() throws Exception {
Session session = sessionFactory.openSession();
session.beginTransaction();
// -------------------------------------------- User user = (User) session.get(User.class, 5); // 持久化
System.out.println(user.getClass());
// System.out.println("---");
// System.out.println(user.getName()); // --------------------------------------------
session.getTransaction().commit();
session.close();
} // load():获取数据,是持久化状态
// 会生成:select ... where id=?
// load()后返回的是一个代理对象,要求类不能是final的,否则不能生成子类代理,就不能使用懒加载功能了。
// 让懒加载失效的方式:一、把实体写成final的;二、在hbm.xml中写<class ... lazy="false">
// 不会马上执行sql语句,而是在第1次使用非id或class属性时执行sql。
// 如果数据不存在,就抛异常:ObjectNotFoundException
@Test
public void testLoad() throws Exception {
Session session = sessionFactory.openSession();
session.beginTransaction();
// -------------------------------------------- User user = (User) session.load(User.class, 5);
System.out.println(user.getClass());
System.out.println("---");
System.out.println(user.getId());
System.out.println(user.getName());
// System.out.println(user.getName()); // --------------------------------------------
session.getTransaction().commit();
session.close();
} // 操作大量数据,要防止Session中对象过多而内存溢出
@Test
public void testBatchSave() throws Exception {
Session session = sessionFactory.openSession();
session.beginTransaction();
// -------------------------------------------- for (int i = 0; i < 30; i++) {
User user = new User();
user.setName("测试");
session.save(user); if (i % 10 == 0) {
session.flush(); // 先刷出
session.clear(); // 再清空
}
} // --------------------------------------------
session.getTransaction().commit();
session.close();
} @Test
public void test2() throws Exception {
Session session = sessionFactory.openSession();
session.beginTransaction();
// -------------------------------------------- User user = (User) session.get(User.class, 5); // 持久化
System.out.println(user.getName()); // session.clear();
// user = (User) session.get(User.class, 5); // 持久化 session.refresh(user); // 刷新Session缓存中对象的状态,即重新select一下
System.out.println(user.getName()); // --------------------------------------------
session.getTransaction().commit();
session.close();
}
}

对于刚创建的一个对象,如果session中和数据库中都不存在该对象,那么该对象就是临时对象(Transient)

临时对象调用save方法,或者游离对象调用update方法可以使该对象变成持久化对象,如果对象是持久化对象时,那么对该对象的任何修改,都会在提交事务时才会与之进行比较,如果不同,则发送一条update语句,否则就不会发送语句

游离对象就是,数据库存在该对象,但是该对象又没有被session所托管

最新文章

  1. win10系统下连接无线网络掉线问题解决办法
  2. SQL Server系统存储过程
  3. 1.1---判断字符串是否所有字符都不相同(CC150)
  4. UVa 2197 &amp; 拆点分环费用流
  5. 小计-git
  6. MatLab GUI Use Command for Debug 界面调试的一些方法
  7. object-c NSString 转成特定编码格式如utf8、gbk等
  8. qml android 的一个例子qtHangMan
  9. archlinux log 文件查看
  10. 安装Ubuntu时,遇到自定义交换空间swap大小设置问题
  11. 使用Xib添加自定义View
  12. Visual Studio For MacOS .NetCore开发踩坑记
  13. hbase优化之region合并和压缩
  14. JSP中的编译指令和动作指令的区别
  15. Ajax分页 Spring MVC + Hibernate
  16. Install Docker Compose
  17. windows每天备份文件的bat脚本【原创】
  18. MySQL中 指定字段排序函数field()的用法
  19. Kestrel:Net Core的跨平台服务器
  20. maven 打包报错(增加调试信息)

热门文章

  1. Python3 图像边界识别
  2. java注解的概念理解
  3. Java中设置方法执行的超时时间java.util.concurrent.Future
  4. Nmap 7.70新增功能——扫描主机所有IP
  5. Chrome 浏览器的Secure Shell插件
  6. 非常简单的方法实现ViewPager自动循环轮播
  7. json字符串转换对象的方法1
  8. 使用 IntraWeb (29) - 基本控件之 TIWAutherList、TIWAutherINI、TIWAutherEvent
  9. Spring 3.1 M1: Unified Property Management(转)
  10. 在AngularJS中实现一个延迟加载的Directive