java hibernate事务处理_Hibernate中的事务处理流程详解

本文详细介绍了Hibernate中的事务处理流程,包括使用Hibernate操作数据库的基本步骤、配置文件hibernate.cfg.xml的解析、映射文件的构成,以及Configuration、SessionFactory、Session和Transaction的角色和使用方法。
摘要由CSDN通过智能技术生成

一、Hibernate操作的基本流程

使用 Hibernate 进行数据持久化操作,通常有如下步骤:

1、编写持久化类: POJO + 映射文件

2、获取 Configuration 对象

3、获取 SessionFactory 对象

4、获取 Session,打开事务

5、用面向对象的方式操作数据库

6、关闭事务,关闭 Session

二、配置文件hibernate.cfg.xml详解

/p>

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

com.mysql.jdbc.Driver

jdbc:mysql://localhost/hibernate

root

123456

20

true

50

23

false

true

UTF-8

org.hibernate.dialect.MySQLDialect

三、Hibernate映射文件

Hibernate映射文件是Hibernate与数据库进行持久化的桥梁Hibernate映射文件主要内容:

1、映射内容的定义

Hibernate映射文件由节点,来定义映射内容并指定所对应的JavaBean的位置(也可以不在该节点中用package属性指定对应的JavaBean位置,而在该节点下的class节点中的name属性中指定)

2、数据库和JavaBean的关联:

Hibernate映射文件中用节点下的

节点指定数据库表和JavaBean的关联。

3、主键映射:

在节点下用

节点映射对应的主键,该节点必须有且只有一个(因为主键只有一个),同时必须放在节点前

4、heibernate的主键映射方式

在节点下用节点指定Hibernate向数据库插入数据时主键的生成方式。

** assigned:应用程序自身对id赋值。当设置时,应用程序自身需要负责主键id的赋值,由外部程序负责生成(在session.save()之前为对象的主键设置值),无需Hibernate参与,一般应用在主键为自然主键时。例如XH为主键时,当添加一个学生信息时,就需要程序员自己设置学号的值,这时就需要应用该id生成器。

** native:由数据库对id赋值。当设置时,数据库负责主键id的赋值,最常见的是int型的自增型主键。例如,在SQLServer中建立表的id字段为identity,配置了该生成器,程序员就不用为该主键设置值,它会自动设置。

** identity:采用数据库提供的主键生成机制,为long/short/int型列生成唯一标识如SQL Server、MySQL中的自增主键生成机制。

** hilo:通过hi/lo算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。

** seqhilo:与hi/lo类似,通过hi/lo算法实现的主键生成机制,只是主键历史状态保存在sequence中,适用于支持sequence的数据库,如Oracle。

** increment:主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一个数据库有多个实例访问,这种方式应该避免使用

** sequence:采用数据库提供的sequence机制生成主键,用于用序列方式产生主键的数据库(如:Oracle、DB2等的Sequence),用于为long/short/int型列生成唯一标识,如:序列名如Oracle sequence。

** uuid.hex:由Hibernate基于128位唯一值产生算法,根据当前设备IP、时间、JVM启动时间、内部自增量等4个参数生成十六进制数值(编码后长度为32位的字符串表示)作为主键。即使是在多实例并发运行的情况下,这种算法在最大程度上保证了产生id的唯一性。当然,重复的概率在理论上依然存在,只是概率比较小。一般而言,利用uuid.hex方式生成主键将提供最好的数据插入性能和数据平台适应性。

** uuid.string:与uuid.hex类似,只是对生成的主键进行编码(长度为16位)。在某些数据库中可能出现问题。

** foreign:使用外部表的字段作为主键。该主键一般应用在表与表之间的关系上,会在后面的表对应关系上进一步讲解。

** select:Hibernate 3新引入的主键生成机制,主要针对遗留系统的改造工程。

由于常用的数据库,如SQLServer、MySQL等,都提供了易用的主键生成机制(如auto-increase字段),可以在数据库提供的主键生成机制上,采用native生成器来配置主键生成方式。

5、普通字段映射:

在节点下用

节点映射普通字段,该节点可有多个(一个字段用一个该节点来映射)

四、Configuration 类

1、Configuration 类负责管理 Hibernate 的配置信息。包括如下内容:

Hibernate 运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应 hibernate.cfg.xml 文件),还包括持久化类与数据表的映射关系(*.hbm.xml 文件)

2、创建 Configuration 的两种方式

**  属性文件(hibernate.properties):

Configuration cfg = new Configuration();

**   Xml文件(hibernate.cfg.xml)

Configuration cfg = new Configuration().configure();

Configuration 的 configure 方法还支持带参数的访问:

File file = new File(“simpleit.xml”);

Configuration cfg = new Configuration().configure(file);

//加载Hibernate的配置文件

Configuration config = new Configuration().configure("/hibernate/hibernate.cfg.xml");

//还可以加载映射文件

Configuration config = new Configuration().addFile("TRegister.hbm.xml");//方法一

Configuration config = new Configuration().addClass(hibernate.PO.TRegister.class);//方法二

Configuration config = new Configuration().addURL(Configuration.class.getResource("TRegister.hbm.xml"));//方法三

五、SessionFactory接口

1、针对单个数据库映射关系经过编译后的内存镜像,是线程安全的。 SessionFactory 对象一旦构造完毕,即被赋予特定的配置信息。

2、SessionFactory是生成Session的工厂。构造 SessionFactory 很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory 对象。

3、Hibernate4 新增了一个 ServiceRegistry 接口,所有基于 Hibernate 的配置或者服务都必须统一向这个 ServiceRegistry  注册后才能生效

Hibernate4 中创建 SessionFactory 的步骤:

Configuration config = new Configuration().configure();

ServiceRegistry serviceRegistry=

new ServiceRegistryBuilder().applySettings(config.getProperties())

.buildServiceRegistry();

sessionFactory = config.buildSessionFactory(serviceRegistry);

当客户端发送一个请求线程时,SessionFactory生成一个Session对象来处理客户请求,如下:

public static final ThreadLocal session = new ThreadLocal();

public static Session currentSession() throws HibernateException

{

Session s = (Session)session.get();

//Open a new Session,if this Thread has none yet

//如果此线程还没有打开一个Session,则新建一个

if(s == null || !s.isOpen())

{

s = sessionFactory.openSession();

session.set(s);

}

return s;

}

六、Session接口

Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作。此对象的生命周期很短。Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久层操作的数据都缓存在 session 对象处。相当于 JDBC 中的 Connection。

Session对象是通过SessionFactory创建的:

Session      session = SessionFactory.openSession();

一个持久化类与普通的JavaBean没有任何区别,但是它与Session关联后,就具有了持久化能力。当然,这种持久化操作是受Session控制的,即通过Session对象的装载,保存,创建或查询持久化对象。Session类的save(),delete()和load()等方法,来分别完成对持久化对象的保存,删除,修改加载等操作!Session类方法的用途可以分以下五类:

1:取得持久化对象:get()和load()等方法。

2:持久化对象的保存,更新和删除:save(),update()saveOrUpdate()和delete()等方法。

3:createQuery()方法:用来从Session生成的Query对象。

4:beginTransaction()方法:从Session对象生成一个Transaction对象。

5:管理Session的方法:isOpen(),flush(),clear(),evict()和close()等方法,其中isOpen()方法用来检查Session是否仍然打开;flush()用来清理Session缓存,并把缓存中的SQL语句发送出去,clear()用来清除Session中的所有缓存对象evict()方法来清楚Session缓存中的某个对象;close()关闭Session。

七、Transaction(事务)

Transaction代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。

Transaction tx = session.beginTransaction();

常用方法:

commit():提交相关联的session实例

rollback():撤销事务操作

wasCommitted():检查事务是否提交

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值