`

hibernate中session的常见方法说明

 
阅读更多

HibernateUtil类:

package sun.util;

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

public class HibernateUtil {
	private static HibernateUtil instance = new HibernateUtil();
	private SessionFactory sf;

	private HibernateUtil() {
		Configuration cfg = new Configuration().configure();
		sf = cfg.buildSessionFactory();
	}

	public static HibernateUtil getInstance() {
		return instance;
	}

	public Session getSession() {
		return sf.openSession();
	}
}

测试类:

package sun.test;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.jdbc.Work;
import org.junit.Test;

import sun.domain.Employee;
import sun.util.HibernateUtil;

public class TestHibernateSession {
	private HibernateUtil util;

	@Test
	public void testSessionCache() {
		Session session = HibernateUtil.getInstance().getSession();
		Employee e = (Employee) session.get(Employee.class, 1L);
		Employee e1 = (Employee) session.get(Employee.class, 1L);
		/*
		 * 仅仅发送了一条sql : select employee0_.EMP_ID as EMP1_0_0_, employee0_.NAME
		 * as NAME0_0_, employee0_.EMAIL as EMAIL0_0_, employee0_.AGE as
		 * AGE0_0_, employee0_.BIRTH_DATE as BIRTH5_0_0_ from EMP employee0_
		 * where employee0_.EMP_ID=?
		 * 
		 * 返回结果:true
		 * 
		 * 结论:session上存在一级缓存,第二次查询的数据直接从一级缓存中查询,而不会再次发送sql语句.
		 */
		System.out.println(e == e1);
		session.close();
	}

	@Test
	public void testSessionClear() {
		Session session = HibernateUtil.getInstance().getSession();
		Employee e = (Employee) session.get(Employee.class, 1L);
		// clear会直接清除一级缓存中的数据,所以第二次获取数据会重新发送sql
		session.clear();
		Employee e1 = (Employee) session.get(Employee.class, 1L);
		System.out.println(e == e1);
		session.close();
	}

	@Test
	public void testSessionEvict() {
		Session session = HibernateUtil.getInstance().getSession();
		Employee e = (Employee) session.get(Employee.class, 1L);
		/*
		 * evict将某个特定的对象从一级缓存中删除。
		 * 
		 * 注意:delete方式直接删除数据库中的数据,而evict和clear只处理一级缓存中的数据.
		 */
		session.evict(e);
		Employee e1 = (Employee) session.get(Employee.class, 1L);
		System.out.println(e == e1);
		session.close();
	}

	@Test
	public void testSessionDoWork() {
		Session session = HibernateUtil.getInstance().getSession();
		/*
		 * doWork方法是我们能够拿到session上的connection,从而完成一些事情.
		 * 
		 * 注意:session.connection方法功能一样,但是connection方法存在安全问题,
		 * 例如拿到connection后直接session已经关闭,而后便继续使用
		 * connection对象,就会出错。doWork方法很好的避免了这种问题。
		 */
		session.doWork(new Work() {

			@Override
			public void execute(Connection connection) throws SQLException {
				/*
				 * 必要再这里关闭连接和提交事务,而应该交给session处理
				 */
			}
		});
		session.close();
	}

	@Test
	public void testSessionFlush() {
		Session session = HibernateUtil.getInstance().getSession();
		Transaction tx = session.beginTransaction();
		Employee e = (Employee) session.get(Employee.class, 1L);
		/*
		 * 发送两条sql:
		 * 
		 * 1、select employee0_.EMP_ID as EMP1_0_0_, employee0_.NAME as NAME0_0_,
		 * employee0_.EMAIL as EMAIL0_0_, employee0_.AGE as AGE0_0_,
		 * employee0_.BIRTH_DATE as BIRTH5_0_0_ from EMP employee0_ where
		 * employee0_.EMP_ID=?
		 * 
		 * 2、update EMP set NAME=?, EMAIL=?, AGE=?, BIRTH_DATE=? where EMP_ID=?
		 * 
		 * 说明;如果没有调用session.flush()方法,提交事务时,即调用tx.commit()方法时,hibernate会发送一条update语句
		 * ,自动更新session一级缓存中的脏数据( 即已经被修改过的数据),
		 * 如果直接调用session.flush()方法,则在此时会发送一条update语句
		 * ,会直接刷新一级缓存中的脏数据到数据库,而不是提交事务时才发送update.
		 */
		e.setName("嘿嘿1");
		System.out.println("----------before flush-----------");
		session.flush();
		System.out.println("----------before commit-----------");
		tx.commit();
		session.close();
	}

	@Test
	public void testSessionGetIdentifier() {
		Session session = HibernateUtil.getInstance().getSession();
		Employee e = (Employee) session.get(Employee.class, 1L);
		/*
		 * 获取对象的主键,从对象映射文件中获取,在自己实现二级缓存的时候有用
		 */
		Serializable s = session.getIdentifier(e);
		System.out.println(s);
		session.close();
	}

	@Test
	public void testSessionMerge() {
		Session session = HibernateUtil.getInstance().getSession();
		Transaction tx = session.beginTransaction();
		// Employee e = (Employee) session.get(Employee.class, 1L);
		// e.setName("呵呵");
		Employee e = new Employee();
		e.setName("王五");
		e.setAge(25);
		e.setEmail("wangwu@baidu.com");
		try {
			e.setBirthDate(new SimpleDateFormat("yyyy-MM-dd")
					.parse("1986-01-01"));
		} catch (ParseException e1) {
			e1.printStackTrace();
		}
		/*
		 * merge 合并,即保存或更新对象.数据库存在则更新,否则新增.
		 * 
		 * 该方法功能同saveOrUpdate
		 */
		session.merge(e);

		tx.commit();
		session.close();
	}

	@Test
	public void testSessionPersist() {
		Session session = HibernateUtil.getInstance().getSession();
		Transaction tx = session.beginTransaction();

		Employee e = new Employee();
		e.setName("赵六");
		e.setAge(25);
		e.setEmail("zhaoliu@gmail.com");
		/*
		 * 功能同save,区别:如果没有开启事务,save方法任然会发送一条sql,但是没有事务最终被回滚;而persist方法如果没有开启事务,
		 * 不会发送sql,提高了性能(JPA的方法).
		 */
		session.persist(e);
		tx.commit();
		session.close();
	}
}

增删改查:

package sun.test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Before;
import org.junit.Test;

import sun.domain.Employee;
import sun.util.HibernateUtil;

public class TestHibernate extends TestHibernateSession {
	private HibernateUtil util;

	@Before
	public void test() {
		util = HibernateUtil.getInstance();
	}

	@Test
	public void testSave() {

		Session s = util.getSession();
		Transaction tx = s.beginTransaction();
		Employee e = new Employee();
		e.setName("张三");
		e.setEmail("zhangsan@126.com");
		try {
			e.setBirthDate(new SimpleDateFormat("yyyy-MM-dd")
					.parse("2010-10-10"));
		} catch (ParseException e1) {
			e1.printStackTrace();
		}
		e.setAge(20);
		// 保存
		s.save(e);
		tx.commit();

		s.close();
	}

	@Test
	public void testUpdate() {
		Session s = util.getSession();
		Transaction tx = s.beginTransaction();

		Employee e = (Employee) s.get(Employee.class, 1L);
		e.setName("李四");
		// 更新
		s.update(e);
		tx.commit();
		s.close();
	}

	@Test
	public void testGet() {
		Session s = util.getSession();
		// 获取
		Employee e = (Employee) s.get(Employee.class, 1L);
		System.out.println(e);
	}

	@Test
	public void testList() {
		Session s = util.getSession();
		// 查询多条数据
		Query q = s.createQuery("SELECT e FROM Employee e");
		@SuppressWarnings("unchecked")
		List<Employee> es = q.list();
		System.out.println(es);
	}
}


分享到:
评论

相关推荐

    hibernate中文参考文档

    6. 集合类映射:在Java中集合是常用的,Hibernate支持集合类的映射,这部分将解释如何映射List、Set、Map等集合类型。 7. 组件映射:当一个类的属性是由其他几个类的属性组合而成时,可以使用组件映射。这部分内容...

    Hibernate官方中文参考手册下载

    在Hibernate中,每个Java类都可以映射为数据库中的一个表,通过注解或者XML文件进行配置。注解如@Entity、@Table、@Id等用于声明实体类和字段的数据库属性。XML文件通常命名为 "*.hbm.xml",包含类到表的映射信息。 ...

    Hibernate 参数查询通用方法

    在Dao层实现通用方法时,我们可以抽象出一个基类,包含一些常用的方法,如`queryByParams`,这个方法接受一个Map参数,键对应于HQL或Criteria查询中的参数名,值则是参数的实际值。这样,不同的查询只需要传入不同的...

    Spring Hibernate 事务处理 详细说明

    在IT行业中,Spring和Hibernate是两个非常重要的框架,它们分别专注于IoC(Inversion of Control,控制反转)和ORM(Object-Relational Mapping,对象关系映射)。在企业级Java应用开发中,事务处理是核心功能之一,...

    Hibernate 3.5.2 中文API

    通过阅读"Hibernate 3.5.2 中文API"文档,开发者可以详细了解上述各个方面的具体使用方法,包括详细的API说明、示例代码以及常见问题解答。"下载说明.htm"和"使用说明.txt"可能提供了下载和安装指南,而"使用帮助...

    Hibernate+中文文档

    1. 翻译说明 2. 版权声明 1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6...

    Hibernate中文参考手册

    - **Session接口**: 在Hibernate中,Session是执行所有数据库操作的核心接口,包括查询、保存、更新实体对象等。 - **SessionFactory**: 负责创建Session实例,是线程安全的。通常情况下,一个应用程序只需要一个...

    ssh框架中的hibernate5

    SSH框架,全称为Spring、Struts和Hibernate,是Java Web开发中常见的三大开源框架的组合。这个框架集合提供了模型-视图-控制器(MVC)的设计模式,使得开发者能够更高效地构建动态网站和企业级应用程序。在这个组合...

    小码哥Hibernate封装的查询方法的皮毛介绍共4页.p

    这篇资料主要探讨了小码哥对Hibernate框架中查询方法的封装,虽然仅提供了4页的介绍,但足以涵盖一些基础和实用的概念。Hibernate是一个流行的Java持久化框架,它简化了数据库操作,使开发者可以更专注于业务逻辑而...

    Hibernate中文详细学习文档

    1. 翻译说明 2. 版权声明 1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6...

    hibernate3.2中文文档(chm格式)

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    Beginning Hibernate, 3rd Edition

    - **Session 的角色**:解释了 Session 在 Hibernate 中的作用及其生命周期管理。 - **常用方法使用**:提供了获取 Session 实例、执行 CRUD 操作的具体方法和示例代码。 #### 十、搜索与查询 - **查询方式**:...

    hibernate5常用的jar包集合(连接mysql)

    **Hibernate 5是一个强大的对象关系映射(ORM)框架,用于简化Java开发中的数据库操作。在本集合中,我们关注的是与Hibernate 5配合使用的jar包,特别针对MySQL数据库的连接。以下是一些关键知识点的详细说明:** 1...

    hibernate多表联合查询

    在关系型数据库中,这种查询非常常见,尤其是在需要从不同表中获取关联数据的情况下。 在Hibernate中,可以使用以下几种方式来实现多表联合查询: - **HQL (Hibernate Query Language)** - **Criteria API** - **...

    Hibernate 中文 html 帮助文档

    1. 翻译说明 2. 版权声明 1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. ...

    hibernate_reference使用指南全

    说明如何使用 Hibernate 的上下文会话功能来管理 Session 的生命周期。 #### 五、配置 **3.1 程序式配置** 介绍如何通过 Java 代码来配置 Hibernate,这种方式适用于需要动态配置的情况。 - **3.2 获取 ...

    Tomcat下配置Hibernate

    本文将详细介绍如何在Tomcat环境下配置Hibernate,并通过示例代码来具体说明配置过程中的关键点。 #### 二、配置流程概述 1. **环境搭建**:首先确保已经安装了Tomcat服务器和相应的数据库(如SQL Server)。 2. *...

    Hibernate jar包下载

    在下载并解压后的"使用说明.txt"文件中,可能会包含如何将这些jar文件添加到项目的类路径、配置Hibernate的属性文件(如hibernate.cfg.xml)、创建实体类、编写映射文件(.hbm.xml)、使用Session工厂和Session进行...

    Hibernate3.2官方中文参考手册+英文手册+API文档

    CHM(Compiled HTML Help)文件是一种常见的Windows帮助文档格式,它包含了Hibernate3.2的所有公开API接口和类的详细说明。开发者可以在这里找到关于SessionFactory、Session、Query等核心接口的用法,以及Criteria...

    Hibernate 应用开发文档+API

    实体类的注解是现代Hibernate开发中的常见方式,例如@Entity、@Table、@Id等,这些注解用于标记类和属性,指示它们在数据库中的对应关系。 对于数据的增删改查,Hibernate提供了方便的方法,如Session的save()和...

Global site tag (gtag.js) - Google Analytics