【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配置文件经常使用设置
<class>标签经常使用属性:
<id>标签的经常使用属性:
常见主键生成策略:
【Hibernate】(2)Hibernate配置与session、transaction的更多相关文章
- Hibernate Session & Transaction详解
Hibernate Session & Transaction详解 HIbernate中的Session Session是JAVA应用程序和Hibernate进行交互时使用的主要接口,它也是持 ...
- Hibernate有五大核心接口,分别是:Session Transaction Query SessionFactoryConfiguration
Session接口: Session接口 Session 接口对于Hibernate 开发人员来说是一个最重要的接口.然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都 ...
- hibernate学习笔记(3)hibernate常用配置以及session对象
更改hibernate.cfg.xml的内容,常用配置有: <!-- 把hibernate运行时的SQL语句显示到控制台 --> <property name="sho ...
- Hibernate二级缓存配置
一.定义: 二级缓存是进程或集群范围内的缓存,可以被所有的Session共享,是可配置的插件 二.二级缓存原理图 解析:每次从二级缓存中取出的对象,都是一个新的对象. 三.配置步骤如下: 同理:以员工 ...
- Hibernate入门3.配置映射文件深入
Hibernate入门3.配置映射文件深入 2013.11.27 前言: 之前的两节是在Java项目中如何使用hibernate,并且通过一个简单地项目实践,期间有很多的错误,一般都是因为配置包的问题 ...
- hibernate进阶--一对多映射配置
hibernate作为一款优秀的ORM框架,广受大家喜爱,也被Java社区公认为持久层的首选.虽然jdbc为Java数据库操 作带来了诸多便利,但是并没有统一SQL语句的写法,而且具体操作数据库的代码 ...
- Hibernate笔记——C3P0配置
Hibernate作为持久层(ORM)框架,操作数据库,自然也就离不开数据库连接池了.其支持多种连接池,这里就用最熟悉的C3P0连接池. C3P0连接池前面已经介绍了并使用很多次了就不再详细说明了. ...
- Hibernate笔记——Hibernate介绍和初次环境配置
Hibernate简介 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate ...
- hibernate安装和配置和第一个Hibernate应用
ssh的各个版本要搭配好,struts2.3一般搭配hibernate4.x,我下的是4.3. Hibernate4的改动较大只有spring3.1以上版本能够支持,Spring3.1取消了Hiber ...
随机推荐
- CSS3-文本-text-overflow
text-overflow 语法: text-overflow : clip | ellipsis 取值说明: 1.clip:表示不显示省略标记(...),而只是简单的裁切,需要在一定的高度范围内配合 ...
- verilog behavioral modeling--sequential and parallel statements
1.Sequential statement groups the begin-end keywords: .group several statements togethor .cause the ...
- numpy模块(对矩阵的处理,ndarray对象)
6.12自我总结 一.numpy模块 import numpy as np约定俗称要把他变成np 1.模块官方文档地址 https://docs.scipy.org/doc/numpy/referen ...
- NYOJ 995 硬币找零
硬币找零 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从 ...
- 【java基础 6】java的发展史简介
结合到近期在做springboot框架开发遇到的关于jdk版本的问题,本篇博客,主要介绍一下java的发展历史,侧重纯文介绍每个版本的特性.--主要从理论上做个宏观的了解,不做具体的技术研究讨论! 一 ...
- 网页QQ唤起
网页QQ唤起 <html> <head> <meta http-equiv="Content-Type" content="text/htm ...
- SPOJ-COLONY - Linearian Colony!简单二分思想
COLONY - Linearian Colony 一道很水的题却坑我两天!在CF上做过类似的题,用递归可以找到答案,但感觉不会这么麻烦,于是看看有没有什么规律,对Y分奇偶貌似可以找到规律,但WA了三 ...
- Title共通写法
用: <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_c ...
- sqlite-jdbc
sqlite-jdbc驱动下载 https://bitbucket.org/xerial/sqlite-jdbc/downloads import java.sql.*; public class T ...
- spring之lazy-init
lazy-init:延迟实例化 ApplicationContext实现的默认行为就是在启动服务器时将所有singleton bean提前进行实例化.提前实例化意味着作为初始化过程的一部分,appli ...