【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 ...
随机推荐
- linux 04 CentOS安装
今天在Vmware上安装了CentOS6.5系统,下午首先把书上的安装过程看了一遍,实际进行操作时有些步骤不一样,经过查资料成功安装,说一下收获.选择自定义安装虚拟机,首先创建空白虚拟机,稍后编辑虚拟 ...
- react 列表渲染
https://reactjs.org/docs/lists-and-keys.html#keys 以下代码运行会报错:Warning: Each child in an array or itera ...
- vue组件从开发到发布
组件化是前端开发非常重要的一部分,从业务中解耦出来,可以提高项目的代码复用率.更重要的是我们还可以打包发布,俗话说集体的力量是伟大的,正因为有许许多多的开源贡献者,才有了现在的世界. 不想造轮子的工程 ...
- systemverilog之OOP
what is oop terminology an example class default methods for classes static attibute assigment and c ...
- linux终端颜色控制
引言: 由于在c代码中看到过打印彩色字, 又对PS1 想进一步了解,才有了这篇博文.----------------------------------------Linux 终端控制台字体颜色 - ...
- Python9-递归函数-day17
# 计算方法:人脑复杂,计算机简单#查找:找数据#排序#最短路径#我们学习的算法都是过去时#要了解基础的算法,才能创造出更好的算法#不是所有的事情都能套用现成的方法解决的# 有些时候会用到学过的算法只 ...
- PAT Basic 1037
1037 在霍格沃茨找零钱 如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一 ...
- NYOJ 1023 还是回文
还是回文 时间限制:2000 ms | 内存限制:65535 KB 难度:3 描述 判断回文串很简单,把字符串变成回文串也不难.现在我们增加点难度,给出一串字符(全部是小写字母),添加或删除一 ...
- zoj 2176 Speed Limit
Speed Limit Time Limit: 2 Seconds Memory Limit: 65536 KB Bill and Ted are taking a road trip. B ...
- CF802D
D. Marmots (easy) time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...