Hibernate事务代码规范写法

来源:互联网 发布:git教程 windows 编辑:程序博客网 时间:2024/06/13 10:24

----------------siwuxie095

  

  

  

  

  

  

  

事务相关概念

  

  

1、什么是事务

  

逻辑上的一组操作,构成这组操作的各个单元,要么一起成功,

要么一起失败

  

  

  

2、事务的四个特性

  

1)原子性

  

2)一致性

  

3)隔离性

  

4)持久性

  

  

  

3、不考虑隔离性,产生的问题

  

1脏读

  

2不可重复读

  

3幻读(也称虚读

  

  

  

4、设置事务隔离级别,即可解决不考虑隔离性所产生的问题

  

「MySQL 默认的隔离级别:Repeatable Read(可重复读)」

  

  

  

5、Hibernate 也可以在核心配置文件中配置事务隔离级别

  

<!--

事务隔离级别:

hibernate.connection.isolation = 4

 

1 - Read uncommitted isolation(未提交读:脏读、不可重复读、幻读均可能发生)

2 - Read committed isolation(已提交读:防止脏读发生,不可重复读、幻读均可能发生)

4 - Repeatable read isolation(可重复读:防止脏读、不可重复读发生,幻读可能发生)

8 - Serializable isolation(可串行化:防止脏读、不可重复读、幻读发生)

-->

<propertyname="hibernate.connection.isolation">4</property>

  

  

  

  

  

  

  

Hibernate 事务代码规范写法

  

  

1、代码结构

  

  

  

  

2、具体代码

  

主要函数testTx():

  

//事务代码规范写法

@Test

publicvoid testTx(){

 

SessionFactory sessionFactory=null;

Session session=null;

Transaction tx=null;

 

try {

 

sessionFactory=HibernateUtils.getSessionFactory();

session=sessionFactory.openSession();

//开启事务

tx=session.beginTransaction();

 

//添加操作

User user=new User();

user.setUsername("小明");

user.setPassword("8888");

user.setAddress("中国");

session.save(user);

 

//提交事务

tx.commit();

}catch (Exception e) {

//回滚事务

tx.rollback();

}finally {

//关闭资源

session.close();

sessionFactory.close();

}

 

}

  

  

  

其中,HibernateUtils.java 和 User.java 分别如下:

  

HibernateUtils.java:

  

package com.siwuxie095.utils;

  

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

  

public class HibernateUtils {

 

static Configuration cfg=null;

static SessionFactory sessionFactory=null;

 

//或:加上 private final 亦可,不过此时不能等于 null

// private static final Configuration cfg;

// private static final SessionFactory sessionFactory;

 

//静态代码块

static {

//加载核心配置文件

cfg=new Configuration();

cfg.configure();

sessionFactory=cfg.buildSessionFactory();

 

}

 

//提供方法返回 sessionFactory

public static SessionFactory getSessionFactory() {

return sessionFactory;

}

 

 

}

  

  

  

User.java:

  

package com.siwuxie095.entity;

  

public class User {

  

//Hibernate要求实体类有一个属性唯一,即主键

privateint uid;

private String username;

private String password;

private String address;

 

publicint getUid() {

return uid;

}

publicvoid setUid(int uid) {

this.uid = uid;

}

public String getUsername() {

return username;

}

publicvoid setUsername(String username) {

this.username = username;

}

public String getPassword() {

return password;

}

publicvoid setPassword(String password) {

this.password = password;

}

public String getAddress() {

return address;

}

publicvoid setAddress(String address) {

this.address = address;

}

 

@Override

public String toString() {

return"User [uid=" + uid +", username=" + username + ", password=" + password +

", address=" + address +"]";

}

 

}

  

  

  

  

  

另:

  

User.hbm.xml:

  

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

  

<!--

http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd

 

dtd文件是用于提示的文件,联网即有提示信息,也可

手动添加:Window->Preferences->XML->XML Catalog

点击 Add添加即可,Location即路径,Key即上面的链接,

Key type URI

-->

 

<!--根标签 -->

<hibernate-mapping>

  

<!-- (1)

class标签:配置实体类和数据库表的对应;

name属性:实体类的全路径,即全限定名;

table属性:数据库表的名称(数据库表由 Hibernate自动生成) -->

<classname="com.siwuxie095.entity.User"table="t_user">

 

<!-- (2)

id标签:配置实体类 id和表 id对应(主键);

name属性:实体类里 id属性名称;

column属性:生成表中 id字段名称 -->

<!-- Hibernate要求实体类有一个属性唯一值,

Hibernate要求表中字段有一个属性唯一值 -->

<idname="uid"column="uid">

<!--设置数据库表 id的增长策略,

native:主键 id 值自动增长 -->

<generatorclass="native"></generator>

</id>

 

<!-- (3)

property标签:配置其它属性和表中字段对应;

name属性:实体类属性名称;

column属性:生成表中字段名称 -->

<propertyname="username"column="username"></property>

<propertyname="password"column="password"></property>

<propertyname="address"column="address"></property>

</class>

  

</hibernate-mapping>

  

  

  

hibernate.cfg.xml:

  

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration PUBLIC

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

"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

 

<!--根标签 -->

<hibernate-configuration>

<session-factory>

 

<!--第一部分:配置数据库信息(必须) -->

 

<propertyname="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

<!--或使用 jdbc:mysql:///hibernate_db代替,省略 localhost -->

<propertyname="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_db</property>

<propertyname="hibernate.connection.username">root</property>

<propertyname="hibernate.connection.password">8888</property>

 

 

 

<!--第二部分:配置 Hibernate信息(可选) -->

 

<!--输出底层 sql语句 -->

<propertyname="hibernate.show_sql">true</property>

<!--输出底层 sql语句格式 -->

<propertyname="hibernate.format_sql">true</property>

<!-- Hibernate帮助创建表,不是自动创建,而需要配置之后。

update:如果已经有表,就更新,如果没有,就自动创建 -->

<propertyname="hibernate.hbm2ddl.auto">update</property>

<!--配置数据库方言,让 Hibernate框架识别不同数据库自己特有的语句。

如:在 MySQL中实现分页的关键字 limit,只能在 MySQL 中使用,而

Oracle中实现分页的关键字则是 rownum -->

<propertyname="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

<!--

事务隔离级别:

hibernate.connection.isolation = 4

 

1 - Read uncommitted isolation(未提交读:脏读、不可重复读、幻读均可能发生)

2 - Read committed isolation(已提交读:防止脏读发生,不可重复读、幻读均可能发生)

4 - Repeatable read isolation(可重复读:防止脏读、不可重复读发生,幻读可能发生)

8 - Serializable isolation(可串行化:防止脏读、不可重复读、幻读发生)

-->

<propertyname="hibernate.connection.isolation">4</property>

  

 

 

<!--第三部分:引入映射配置文件,把映射配置文件放到核心配置文件(必须) -->

<mappingresource="com/siwuxie095/entity/User.hbm.xml"/>

</session-factory>

</hibernate-configuration>

  

  

  

  

  

  

  

  

  

【made by siwuxie095】

原创粉丝点击