【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可变长子网 ...
- Python Hashlib笔记
#python3.4hashlib module - A common interface to many hash functions.hash.digest() - Return the dige ...
- PAT Basic 1065
1065 单身狗 “单身狗”是中文对于单身人士的一种爱称.本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱. 输入格式: 输入第一行给出一个正整数 N(≤ 50 000),是已知夫妻/伴侣 ...
- 解决img标签上下出现间隙的方法
图片与父元素下边缘有 2px 的间隙,并不是因为空格.多个 inline-block 元素之间的间隙才是因为空格. 任何不是块级元素的可见元素都是内联元素,其表现的特性是“行布局”形式.----< ...
- linux救援
1.单用户模式(类比win的安全模式) 1.1.开机按任意键 1.2.按E进入编辑模式 1.3.光标移动到第二个(“kernel xxxx”)按e 1.4.在quiet 后面输入“ 1” or “S” ...
- linux 第五部分 系统管理员 网络设定与备份
linux 第五部分 系统管理员 网络设定与备份 系统基本设置 1.网络的设置 手动设置与dhcp自动获得 以及更改主机名称 centos 7 对网卡编号的规则 enol1 b ...
- HDU 3947 River Problem
River Problem Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ...
- nginx反向代理,负载均衡,动静分离,rewrite地址重写介绍
一.rewrite地址重写 地址转发后客户端浏览器地址栏中的地址显示是不变的,而地址重写后地址栏中的地址会变成正确的地址. 在一次地址转发过程中只会产生一次网络请求,而一次地址重写产生两次请求. 地址 ...
- 开源中国git关联xcode操作步骤
1.网上代码托管有好多我选了开源中国的git 2.开源中国链接:http://git.oschina.net 3.在git上创建一个新的项目 4.打开终端全局设置名字和邮箱 tanqihongdeiM ...
- 刷题总结——bzoj1725(状压dp)
题目: 题目描述 Farmer John 新买了一块长方形的牧场,这块牧场被划分成 N 行 M 列(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地. FJ ...