【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 ...
随机推荐
- 网络设备之ospf2
OSPF(Open Shortest Pass First,开放最短路径优先协议),是一个最常用的内部网管协议,是一个链路状态协议. OSPF的特点 OSPF是一种无类路由协议,支持VLSM可变长子网 ...
- 前端用户体验优化: JS & CSS 各类效果代码段
前言 不定时更新 在线预览 https://zzyper.github.io/opti... 在线预览的源码 https://github.com/zzyper/opt... 部分内容仅兼容webki ...
- Struts2之初体验
Struts21.了解Struts2 请求调度框架Struts2是一个MVC框架Struts2类库:Struts2-core Struts2核心XWork-core xwork核心 Struts2的构 ...
- seajs模块化加载框架使用
seajs是模块化加载框架.seajs.org已经打不开了,seajs的github.seajs速查文档 <!--如果完成下面4步,则seajs掌握了80%js模块化1.引入seajs的库 :& ...
- UIDatePicker 显示时间和打印时间不一样
默认是时区为0,如下格式化一下就好啦 UIDatePicker *datePiker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 100, ...
- 【java基础 5】树形结构数据加载的思考
前面两篇文章,分别介绍了使用递归和非递归算法加载树形结构数据的方式,本篇文章,则是自己闲下来的时候,进行的一点小思考. 一.什么地方会用到树形结构 刚开始一看到这种结构的时候,最先是想到了家谱.家谱就 ...
- MHA 高可用集群搭建(二)
MHA 高可用集群搭建安装scp远程控制http://www.cnblogs.com/kevingrace/p/5662839.html yum install openssh-clients mys ...
- 【Luogu】P3116会议时间(拓扑排序,DP)
题目链接 本题使用拓扑排序来规划DP顺序.设s[i][j]表示i步是否能走到j这个点,e[i][j]表示i步是否能走到j这个点——用第二条路径.因为要满足无后效性和正确性,只有第i个点已经全部更新完毕 ...
- 刷题总结——玉蟾宫(bzoj3039单调栈)
题目: Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写着'R ...
- Redis的持久化——RDB
前面说到redis的三大特性:缓存.分布式内存数据库.持久化,所以今天将为大家介绍redis的两种数据持久化技术RDB和AOF, 先介绍RDB吧. 一.RDB是什么? 1.RDB全称redis dat ...