【Hibernate】(2)Hibernate配置与session、transaction

1. Hibernate经常使用配置

使用hibernate.default_schema属性能够让全部生成的表都带一个指定的前缀。

2. session简单介绍

不建议直接使用jdbc的connection操作数据库,而是通过使用session操作数据库。

session能够理解为操作数据库的对象。session与connection是多对一的关系。每一个session都有一个与之相应的connection。一个connection不同一时候刻能够供多个session使用。把对象保存在关系数据库中须要调用session的各种方法,如save(),update(),delete(),createQuery()等。

3. transaction简单介绍

hibernate对数据的操作都是封装在事务其中,而且默认是非自己主动提交的方式。所以用session保存对象时。假设不开启事务,而且手工提交事务。对象并不会真正保存在数据库中。

假设想让hibernate像jdbc那样自己主动提交事务,必须调用session对象的doWork()方法。获得jdbc的connection后。设置其为自己主动提交事务模式。

比如:

		session.doWork(new Work() {

			@Override
			public void execute(Connection conn) throws SQLException {
				conn.setAutoCommit(true);
			}

		});
		session.save(s1); // 保存对象进入数据库
		session.flush();

注意一定不能忘记flush()方法。

4. session具体解释

获取session对象的两种方式:

(1). SessionFactory的openSession()方法

(2) SessionFactory的getCurrentSession()方法

假设使用getCurrentSession须要在hibernate.cfg.xml文件里进行配置:

假设是本地事务(jdbc事务)

		<property name="hibernate.current_session_context_class">thread</property>

假设是全局事务(jta事务)

		<property name="hibernate.current_session_context_class">jta</property>

openSession和getCurrentSession的差别:

(1). getCurrentSession在事务提交或者回滚之后会自己主动关闭,而openSession须要你手动关闭。假设使用openSession而没有手动关闭。多次之后就会导致连接池溢出。

(2). openSession每次创建新的session对象,而getCurrentSession使用现有的session对象。

	@Test
	public void testSaveStudentWithOpenSession() {
		// 获得配置对象
		Configuration config = new Configuration().configure();
		// 获得服务注冊对象
		ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
				.applySettings(config.getProperties()).buildServiceRegistry();
		// 获得SessionFactory对象
		SessionFactory sessionFactory = config
				.buildSessionFactory(serviceRegistry);
		// 获得Session对象
		Session session1 = sessionFactory.openSession();
		// 开启事物
		Transaction transaction = session1.beginTransaction();
		// 生成一个学生对象
		Student s = new Student(1, "李四", "男", new Date(), "北京");
		session1.doWork(new Work() {

			@Override
			public void execute(Connection conn) throws SQLException {
				System.out.println("Connection的hashCode:" + conn.hashCode());
			}
		});
		session1.save(s);
		// session1.close();
		// 提交事务
		transaction.commit();

		// 新创建一个session提交
		Session session2 = sessionFactory.openSession();
		transaction = session2.beginTransaction();
		s = new Student(2, "王五", "男", new Date(), "上海");
		session2.doWork(new Work() {

			@Override
			public void execute(Connection conn) throws SQLException {
				System.out.println("Connection的hashCode:" + conn.hashCode());
			}
		});
		session2.save(s);
		transaction.commit();
	}

	@Test
	public void testSaveStudentWithGetCurrentSession() {
		// 获得配置对象
		Configuration config = new Configuration().configure();
		// 获得服务注冊对象
		ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
				.applySettings(config.getProperties()).buildServiceRegistry();
		// 获得SessionFactory对象
		SessionFactory sessionFactory = config
				.buildSessionFactory(serviceRegistry);
		// 获得Session对象
		Session session1 = sessionFactory.getCurrentSession();
		// 开启事物
		Transaction transaction = session1.beginTransaction();
		// 生成一个学生对象
		Student s = new Student(1, "李四", "男", new Date(), "北京");
		session1.doWork(new Work() {

			@Override
			public void execute(Connection conn) throws SQLException {
				System.out.println("Connection的hashCode:" + conn.hashCode());
			}
		});
		session1.save(s);
		// session1.close();
		// 提交事务
		transaction.commit();

		// 新创建一个session提交
		Session session2 = sessionFactory.getCurrentSession();
		transaction = session2.beginTransaction();
		s = new Student(2, "王五", "男", new Date(), "上海");
		session2.doWork(new Work() {

			@Override
			public void execute(Connection conn) throws SQLException {
				System.out.println("Connection的hashCode:" + conn.hashCode());
			}
		});
		session2.save(s);
		transaction.commit();
	}

通过样例我们能够看出在不关闭session的情况下,使用openSession每一次获得的都是新的session,而使用getCurrentSession获得的都是同一个session,所以在使用openSession获得的session操作完成后。须要手动close掉。

5. hbm配置文件经常使用设置

<hibernate-mapping>标签经常使用属性:

<class>标签经常使用属性:

<id>标签的经常使用属性:

常见主键生成策略:

时间: 2024-11-09 19:30:20

【Hibernate】(2)Hibernate配置与session、transaction的相关文章

Hibernate有五大核心接口,分别是:Session Transaction Query SessionFactoryConfiguration

Session接口: Session接口 Session 接口对于Hibernate 开发人员来说是一个最重要的接口.然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会占用很多资源.这在实际项目中确实很重要,因为在客户程序中,可能会不断地创建以及销毁Session对象,如果Session 的开销太大,会给系统带来不良影响.但是Session对象是非线程安全的,因此在你的设计中,最好是一个线程只创建一个Session对象. session可以看作介于数据连接与事

Hibernate Session &amp; Transaction详解

Hibernate Session & Transaction详解 HIbernate中的Session Session是JAVA应用程序和Hibernate进行交互时使用的主要接口,它也是持久化操作核心API, 注意这里的Session的含义,它与传统意思上web层的HttpSession并没有关系,Hibernate Session之与Hibernate,相当于JDBC Connection相对与JDBC. Session对象是有生命周期的,它以Transaction对象的事务开始和结束边界

【Hibernate】Hibernate的在Eclipse+Mysql的配置、安装,纯Java,利用Annotation与HQL完成数据库的增删改查

这篇文章有很多槽点,在Hibernate4.x上面用着Hibernate3.x的写法去写.而且程序中放到Eclipse中会有一大堆警告,但是这好歹也在一定程度上完成了Hibernate的入门.毕竟现在很多介绍Hibernate的书籍都是用Hibernate3.x的写法去写.上次那篇<[Hibernate]最简单的Hibernate工程--账号注册系统>(点击打开链接)杂糅Struts的技术其实是不对的.因为Hibernate完成的是,从Java到数据库,从数据库到Java的任务.之后Java与

Hibernate学习——一般配置

mysql建表语句: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); Employee.java package com.study; public class Employee { private

Hibernate之Hibernate环境配置

Hibernate之Hibernate环境配置 一.Hibernate环境搭建的步骤 1.添加Hibernate && SQLServer 的Jar antlr-2.7.7.jar dom4j-1.6.1.jar hibernate-commons-annotations-4.0.5.Final.jar hibernate-core-4.3.11.Final.jar hibernate-jpa-2.1-api-1.0.0.Final.jar jandex-1.1.0.Final.jar j

Hibernate二级缓存配置

一.定义: 二级缓存是进程或集群范围内的缓存,可以被所有的Session共享,是可配置的插件 二.二级缓存原理图 解析:每次从二级缓存中取出的对象,都是一个新的对象. 三.配置步骤如下: 同理:以员工类和部门类为例 ① 引入jar包 ② 关键点: 大配置Hibernate.cfg.xml开启二级缓存 ③ 在src下添加ehcache.xml文件,从etc获取文件即可. ④测试二级缓存(数据散装的特点) public class Test1 { Session session; Transacti

Hibernate中用注解配置一对多双向关联和多对一单向关联

Hibernate中用注解配置一对多双向关联和多对一单向关联 Hibernate提供了Hibernate Annotations扩展包,使用注解完成映射.在Hibernate3.3之前,需单独下载注解开发包 配置持久化类 配置关联关系 下面我们先从多对一单向关联关系讲起,多对一单向关联就是在多的一方植入一的一方的主键作为外键,下面我们先进行初始配置, 在配置的过程中我们会遇到一个问题  就是无论用load还是get都不会出现延迟加载,那么我们应该如何设置为要延迟加载,这样做的好处是可以在用的时候

hibernate进阶--一对多映射配置

hibernate作为一款优秀的ORM框架,广受大家喜爱,也被Java社区公认为持久层的首选.虽然jdbc为Java数据库操 作带来了诸多便利,但是并没有统一SQL语句的写法,而且具体操作数据库的代码也足够复杂,且存在大量重复.所以有了ORM框架,让Java程序员可以从 SQL语句中解放,Hibernate就是其中的翘楚.Hibernate将JDBC进一步的封装了,在SQL的可移植性方面表现优秀,并且使 Hibernate程序代码足够简化. ORM(对象关系映射)是面向对象程序员在代码的编写过程

Hibernate初学---注解配置

ssh框架是每个java程序员的基本功,工作中虽然没有用到,还是学习一下,做点学习笔记,算是一点积累吧. 废话不多说,先上手来一个简单的demo,感受一把. 开发工具:myeclipse 10 数据库:mysql 创建个简单的java工程, 第一步,创建一个学生类,代码如下: package com.huawei.vo; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.p