Hibernate事务代码规范写法
Posted siwuxie095
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate事务代码规范写法相关的知识,希望对你有一定的参考价值。
----------------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(可串行化:防止脏读、不可重复读、幻读发生) --> <property name="hibernate.connection.isolation">4</property> |
Hibernate 事务代码规范写法
1、代码结构
2、具体代码
主要函数 testTx():
//事务代码规范写法 @Test public void 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 要求实体类有一个属性唯一,即主键 private int uid; private String username; private String password; private String address;
public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; }
@Override public String toString() { return "User [uid=" + uid + ", username=" + username + ", password=" + password + ", address=" + address + "]"; }
} |
另:
User.hbm.xml:
<?xml version="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 自动生成) --> <class name="com.siwuxie095.entity.User" table="t_user">
<!-- (2) id 标签:配置实体类 id 和表 id 对应(主键); name 属性:实体类里 id 属性名称; column 属性:生成表中 id 字段名称 --> <!-- Hibernate 要求实体类有一个属性唯一值, Hibernate 要求表中字段有一个属性唯一值 --> <id name="uid" column="uid"> <!-- 设置数据库表 id 的增长策略, native:主键 id 值自动增长 --> <generator class="native"></generator> </id>
<!-- (3) property 标签:配置其它属性和表中字段对应; name 属性:实体类属性名称; column 属性:生成表中字段名称 --> <property name="username" column="username"></property> <property name="password" column="password"></property> <property name="address" column="address"></property> </class>
</hibernate-mapping> |
hibernate.cfg.xml:
<?xml version="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>
<!-- 第一部分:配置数据库信息(必须) -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 或使用 jdbc:mysql:///hibernate_db 代替,省略 localhost --> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_db</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">8888</property>
<!-- 第二部分:配置 Hibernate 信息(可选) -->
<!-- 输出底层 sql 语句 --> <property name="hibernate.show_sql">true</property> <!-- 输出底层 sql 语句格式 --> <property name="hibernate.format_sql">true</property> <!-- Hibernate 帮助创建表,不是自动创建,而需要配置之后。 update:如果已经有表,就更新,如果没有,就自动创建 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 配置数据库方言,让 Hibernate 框架识别不同数据库自己特有的语句。 如:在 MySQL 中实现分页的关键字 limit,只能在 MySQL 中使用,而 在 Oracle 中实现分页的关键字则是 rownum --> <property name="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(可串行化:防止脏读、不可重复读、幻读发 以上是关于Hibernate事务代码规范写法的主要内容,如果未能解决你的问题,请参考以下文章 |