Hibernate之Session方法

对象的状态:

Session中  数库中

-----------------------

临时 无无

持久化 有最终会有

游离 无有

删除 调用了delete()方法后

1,操作实体对象的Session方法

save()

update()

saveOrUpdate()

delete()

2,操作缓存的Session方法

clear()
清空Session缓存,不会执行sql语句。

evict()

flush()
马上执行sql语句,不会清楚Session缓存。

3,查询实体对象的Session方法

get()

load()

createQuery()

createCriteria()

package test.hibernate.session;

public class User {

	private Integer id;
	private String name;
	private byte[] b=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="test.hibernate.session">
	<class name="User" table="session_user">

		<!-- id元素用于映射主键。 子元素generator是用于指定主键生成策略的。 -->
		<id name="id" type="integer" column="id">
			<generator class="native"></generator>
		</id>

		<property name="name" />
	</class>
</hibernate-mapping>
package test.hibernate.session;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class App {

	private static SessionFactory sessionFactory = new Configuration()//
			.configure()//
			.addClass(User.class)// 添加Hibernate实体类(加载对应的映射文件)
			.buildSessionFactory();

	@Test
	public void testSave() throws Exception {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		// --------------------------------------------

		// 构建对象
		User user = new User();// 临时状态
		// user.setId(UUID.randomUUID().toString());//id设为String类型
		user.setName("张三");

		// 保存
		session.save(user);// 变成持久化状态
		System.out.println("=======xxxxxxxxxxxxxx========");
		// --------------------------------------------
		session.getTransaction().commit();
		session.close();

		// 数据库里面有,session里没有,为游离状态
		user.setName("李四");
		System.out.println(user.getName());
	}

	// update():把游离状态变为持久化状态
	@Test
	public void testUpdate() throws Exception {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		// --------------------------------------------

		User user = (User) session.get(User.class, 2);
		// user.setId(1);
		// user.setName("new name");

		// session.flush();// 把user刷出到数据库
		//
		// session.clear();// 变为游离状态,清除session中所有的对象
		session.evict(user);// 清除一个指定的对象

		user.setName("TestName");
		session.update(user);
		System.out.println("===================");
		// --------------------------------------------
		session.getTransaction().commit();
		session.close();
	}

	// saveOrUpdate():把临时或游离状态转为持久化状态
	/*
	 * 本方法根据id判断对象是什么状态。 如果id为原始值(对象是null,原始类型数字是0)就是临时状态; 如果不是原始值就是游离状态
	 */
	@Test
	public void testSaveOrUpdate() throws Exception {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		// --------------------------------------------

		User user = new User();
		user.setId(1);
		user.setName("testSaveOrUpdate");

		session.saveOrUpdate(user);

		// --------------------------------------------
		session.getTransaction().commit();
		session.close();
	}

	// delete():把持久化或游离状态转为删除状态
	// 如果删除的对象不存在,会抛出异常
	@Test
	public void testDelete() throws Exception {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		// --------------------------------------------

		User user = (User) session.get(User.class, 8);
		session.delete(user);
		session.flush();
		System.out.println("==========================");
		// --------------------------------------------
		session.getTransaction().commit();
		session.close();
	}

	// get():获取数据,是持久化状态
	// 如果查询的对象不存在会抛出异常
	@Test
	public void testGet() throws Exception {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		// --------------------------------------------

		User user = (User) session.get(User.class, 8);

		System.out.println(user.getId());
		System.out.println(user.getName());

		// --------------------------------------------
		session.getTransaction().commit();
		session.close();
	}

	// load():懒加载,获取数据,是持久化状态。延迟加载,用的时候才加载
	/*
	 * load()后返回的是一个代理对象,要求类(这里是User类)不能是final的, 否则不能生存子 类代理,就不能使用懒加载功能。
	 */
	@Test
	public void testLoad() throws Exception {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		// --------------------------------------------

		User user = (User) session.load(User.class, 7);

		System.out.println(user.getId());
		System.out.println(user.getName());

		// --------------------------------------------
		session.getTransaction().commit();
		session.close();
	}

	@Test
	public void testBatchSave() throws Exception {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		// --------------------------------------------

		for (int i = 0; i < 50; i++) {
			User user = new User();
			user.setId(i);
			user.setName("ss0" + i);

			session.save(user);

			System.out.println("=====================");

			if (i % 10 == 0) {
				session.flush();// 先刷出
				session.clear();// 再清空
			}
		}
		// --------------------------------------------
		session.getTransaction().commit();
		session.close();
	}
}

让懒加载失效的方式:

1、把实体写成final的

2、在hbm.xml中写<class ... lazy="false">

待续

版权声明:本文为博主原创文章,未经博主允许不得转载。如需转载,请注明出处:http://blog.csdn.net/lindonglian

时间: 2024-11-07 19:37:33

Hibernate之Session方法的相关文章

Hibernate,Session方法使得java对象进入持久化状态;持久化对象特征

以下情况java对象进入持久化状态: session.save()方法把临时对象转变为持久化对象. session.load()和session.get()方法得到的对象总是处于持久化状态. session.update(),saveOrUpdate()和lock()方法使游离对象转变为持久化状态. Query接口的list()方法返回的list集合中存放的都是持久化对象. 一个持久化对象关联一个临时对象,在允许级联保存的情况下,Session在清理缓存时,会把这个临时对象也转变为持久化对象.

Hibernate中Session之get和load方法的真正区别

最近在学习SHH框架中的hibernate,对Session的get和load方法,有点混不清楚,不知道区别在哪,或者对它们的区别感触不深.所以百度了一下,结果问题来了.百度的结果和实际测试的结果出入很大.主要是对get方法的说法跟实际运行的结果不一致. 先说一下观点吧: get不支持lazy,load支持lazy: 数据不存在时,get返回null,load则抛出ObjectNotFoundException异常. load方法可以返回实体的代理类实例,而get方法直接读取数据库,所以直接返回

Hibernate中Session.get()方法和load()方法的详细比较(转)

一.get方法和load方法的简易理解 (1)get()方法直接返回实体类,如果查不到数据则返回null.load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用时,如果没有数据不存在,就会抛出个org.hibernate.ObjectNotFoundException异常 (2)load先到缓存(session缓存/二级缓存)中去查,如果没有则返回一个代理对象(不马上到DB中去找),等后面使用这个代理对象操作的时候,才到DB中查询,这就是我们常说的 load

Hibernate中Session.get()方法和load()方法的详细比较

一.get方法和load方法的简易理解 (1)get()方法直接返回实体类,如果查不到数据则返回null.load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用时,如果没有数据不存在,就会抛出个org.hibernate.ObjectNotFoundException异常 (2)load先到缓存(session缓存/二级缓存)中去查,如果没有则返回一个代理对象(不马上到DB中去找),等后面使用这个代理对象操作的时候,才到DB中查询,这就是我们常说的 load

hibernate的Session的saveOrUpdate等方法的使用

本文主要说的是Session的saveOrUpdate.clear.flush等方法的使用以及控制建表语句的输出等. 1.Session的saveOrUpdate方法 先看下hibernate的API文档的相关描述:  void saveOrUpdate(Object object) Either save() or update() the given instance, depending upon the value of its identifier property. 即根据Id判断是

Hibernate的Session的get()和load()方法区别

hibernate中Session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别. get Session接口提供了4个重载的get方法,分别通过"持久类+主键"和"全类名+主键"以及"锁选项"来获取实体对象. public Object get(Class clazz, Serializable id); public Object get(Class clazz, Serializable i

Hibernate中Session的get和load

hibernate中Session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别.测试版本:hibernate 4.2.0. get Session接口提供了4个重载的get方法,分别通过“持久类+主键”和“全类名+主键”以及“锁选项”来获取实体对象. public Object get(Class clazz, Serializable id); public Object get(Class clazz, Serializable id, L

【转】Hibernate的getSQLQuery方法对char类型的解析问题

[转]Hibernate的getSQLQuery方法对char类型的解析问题 建立数据库: create table T_TEST1( id char (32), name varchar (255), other varchar (255), primary key(id) )insert into T_TEST1 values('2c9090792a18d6ab012a18d77e700001','sfasdf','asdf') insert into T_TEST1 values('2c9

hibernate中session的获取使用以及其他注意事项

hibernate中session的获取使用以及其他注意事项 前言:工作时,在同时使用Hibernate的getSession().getHibernateTemplate()获取Session后进行数据查询时不是出现了"session is close"异常就是出现其他异常问题,痛定思痛,决定收集并整理相关资料,方便今后的使用. 一.session的获取 在hibernate中的Session对象通过SessionFactory来管理,可以通过使用openSession ().get