博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Hibernate】(2)Hibernate配置与session、transaction
阅读量:6863 次
发布时间:2019-06-26

本文共 3806 字,大约阅读时间需要 12 分钟。

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事务)

thread

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

jta
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>标签的经常使用属性:

常见主键生成策略:

你可能感兴趣的文章
(LeetCode 21)Merge Two Sorted Lists
查看>>
requests.exceptions.SSLError: hostname '127.0.0.1' doesn't match None
查看>>
任务调度利器:Celery
查看>>
微博达人硅谷之歌:Testin云測移动搜索性能測试非常是让人信服
查看>>
framebuffer的入门介绍-实现程序分析【转】
查看>>
js 操作json对象增删改
查看>>
来学学数据分析吧(二)第一章 预测和关联数量特征
查看>>
分布式服务框架 Zookeeper(二)官方介绍
查看>>
C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件。...
查看>>
HTTP长连接和短连接 + Websocket
查看>>
Runtime-消息发送和消息转发
查看>>
机器学习、深度学习、和AI算法可以在网络安全中做什么?
查看>>
监听发现局域网dropbox客户端broadcast-dropbox-listener
查看>>
springboot 启动的时候报错 Error creating bean with name 'solrClient'
查看>>
【IntelliJ IDEA】在idea上操作 git分支合并【如何将远程swagger分支 合并到 远程 master分支上】【如何切换 本地分支】...
查看>>
SuperMap iObject入门开发系列之三管线系统标注
查看>>
你需要知道的缓存击穿/穿透/雪崩
查看>>
[转]Hyper-V功能大跃进 或引发市场洗牌
查看>>
关于excel导入到封装成工具类jar包和web版门店收银网络无法无法连接上的解决方法...
查看>>
@InitBinder
查看>>