`
xxp3369
  • 浏览: 151406 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

采用编程式事务

阅读更多
采用编程式事务

1、getCurrentSession()与openSession()的区别?
* 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()
  创建的session则不会
* 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()
  创建的session必须手动关闭
 
2、使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
* 如果使用的是本地事务(jdbc事务)
<property name="hibernate.current_session_context_class">thread</property>
* 如果使用的是全局事务(jta事务)
<property name="hibernate.current_session_context_class">jta</property>


hibernate.cfg.xml


引用
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.url">jdbc:mysql://localhost/spring_hibernate_1</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">bjsxt</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.current_session_context_class">thread</property>
<!--
<property name="hibernate.current_session_context_class">jta</property>
-->
<mapping resource="com/bjsxt/usermgr/model/User.hbm.xml"/>
<mapping resource="com/bjsxt/usermgr/model/Log.hbm.xml"/>
</session-factory>
</hibernate-configuration>
 

log4j.properties


引用
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=warn, stdout

#log4j.logger.org.hibernate=info
#log4j.logger.org.hibernate=debug

### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug

### log just the SQL
#log4j.logger.org.hibernate.SQL=debug

### log JDBC bind parameters ###
#log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug

### log schema export/update ###
#log4j.logger.org.hibernate.tool.hbm2ddl=debug

### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug

### log cache activity ###
#log4j.logger.org.hibernate.cache=debug

### log transaction activity
#log4j.logger.org.hibernate.transaction=debug

### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug

### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace


ExportDB.java


package com.bjsxt.usermgr.util;

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class ExportDB {

	public static void main(String[] args) {
		
		//读取hibernate.cfg.xml文件
		Configuration cfg = new Configuration().configure();
		
		SchemaExport export = new SchemaExport(cfg);
		
		export.create(true, true);
	}
}


HibernateUtils.java


package com.bjsxt.usermgr.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {

	private static SessionFactory factory;
	
	static {
		try {
			Configuration cfg = new Configuration().configure();
			factory = cfg.buildSessionFactory();
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public static SessionFactory getSessionFactory() {
		return factory;
	}
	
	public static Session getSession() {
		return factory.openSession();
	}
	
	public static void closeSession(Session session) {
		if (session != null) {
			if (session.isOpen()) {
				session.close();
			}
		}
	}
}


Log.java


package com.bjsxt.usermgr.model;

import java.util.Date;

public class Log {
	
	private int id;
	
	//操作日志、安全日志、事件日志
	private String type;
	
	private String detail;
	
	private Date time;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public String getDetail() {
		return detail;
	}

	public void setDetail(String detail) {
		this.detail = detail;
	}

	public Date getTime() {
		return time;
	}

	public void setTime(Date time) {
		this.time = time;
	}
}


Log.hbm.xml

引用
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bjsxt.usermgr.model">
<class name="Log" table="t_log">
<id name="id">
<generator class="native"/>
</id>
<property name="type"/>
<property name="detail"/>
<property name="time"/>
</class>
</hibernate-mapping>


User.java

package com.bjsxt.usermgr.model;

public class User {
	
	private int id;
	
	private String name;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}


User.hbm.xml

引用
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bjsxt.usermgr.model">
<class name="User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>



LogManager.java


package com.bjsxt.usermgr.manager;

import com.bjsxt.usermgr.model.Log;

public interface LogManager {
	
	public void addLog(Log log);
}



LogManagerImpl.java



package com.bjsxt.usermgr.manager;

import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.util.HibernateUtils;

public class LogManagerImpl implements LogManager {

	public void addLog(Log log) {
		HibernateUtils.getSessionFactory().getCurrentSession().save(log);
	}

}


UserManager.java

package com.bjsxt.usermgr.manager;

import com.bjsxt.usermgr.model.User;

public interface UserManager {
	
	public void addUser(User user);
}


UserManagerImpl.java

package com.bjsxt.usermgr.manager;

import java.util.Date;

import org.hibernate.Session;

import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.model.User;
import com.bjsxt.usermgr.util.HibernateUtils;

public class UserManagerImpl implements UserManager {

	public void addUser(User user) {
		Session session = null;
		try {
			//session = HibernateUtils.getSession();
			session = HibernateUtils.getSessionFactory().getCurrentSession();
			session.beginTransaction();
			
			session.save(user);

			Integer.parseInt("asdfsdfsfsd");
			Log log = new Log();
			log.setType("安全日志");
			log.setDetail("xxx进入系统");
			log.setTime(new Date());

			LogManager logManager = new LogManagerImpl();
			logManager.addLog(log);

			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
//		}finally {
//			HibernateUtils.closeSession(session);
		}
	}
}


Client.java


package com.bjsxt.usermgr.client;

import com.bjsxt.usermgr.manager.UserManager;
import com.bjsxt.usermgr.manager.UserManagerImpl;
import com.bjsxt.usermgr.model.User;

public class Client {

	public static void main(String[] args) {
		User user = new User();
		user.setName("张三");
		
		UserManager userManager = new UserManagerImpl();
		userManager.addUser(user);
	}
}
分享到:
评论

相关推荐

    spring学习笔记(十五)-编程式事务例子

    然而,有时为了更细粒度的控制或者在特定场景下,我们可能需要采用编程式事务管理。 首先,了解事务的四大特性(ACID)是必不可少的: 1. 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,不...

    spring编程式事务实现

    在Spring框架中,事务管理是应用开发中的重要一环,它确保了数据的一致性和完整性。Spring提供了两种主要的事务管理方式:声明...然而,在实际应用中,应当根据项目需求和团队习惯来决定采用声明式还是编程式事务管理。

    09-4编程式事务管理.rar

    Spring框架提供了两种主要的事务管理方式:声明式事务管理和编程式事务管理。本资料着重于“编程式事务管理”,这是一种通过代码直接控制事务开始、提交、回滚等操作的方式。 在Spring中,编程式事务管理通常使用...

    WEB开发相关的Transaction管理战略

    - 实现方法:采用编程式事务模型,利用JTA等API实现全局事务管理。 - 优势:能够保证跨资源的数据一致性。 3. **高性能事务处理**: - 使用场景:高并发环境下的事务处理。 - 实现方法:结合声明式事务模型和...

    Spring 事务配置的五种方式.docx

    例如,对于一些核心服务使用注解驱动的事务管理,而对于其他辅助服务则采用编程式事务管理。 在配置事务时,通常需要先定义数据源(DataSource),如使用阿里巴巴的Druid数据源: ```xml &lt;!-- 数据源配置项... --...

    J SF 架构 分析

    1. **编程式事务**:在需要精细控制的场景,如权限管理模块,采用编程式事务管理。 2. **声明式事务**:在多数业务场景,如办公用品管理,使用声明式事务,简化事务处理。 3. **无事务处理**:对于无需事务支持的...

    JTA.JTS.J2SE.develop.code.rar_jts

    5. **编程模式**:在J2SE应用中,开发者通常采用编程式事务管理,即在代码中显式调用UserTransaction的开始、提交和回滚方法。而在J2EE应用中,通常使用声明式事务管理,由容器自动管理事务边界。 6. **事务属性**...

    spring声明事务,编程事务实现

    编程式事务管理使用 TransactionTemplate 或者直接使用底层的 PlatformTransactionManager。声明式事务管理有基于 tx 和 aop 名字空间的 xml 配置文件和基于 @Transactional 注解的方式。 为什么使用 Spring 来进行...

    springmvc+mybatis整合

    4. **事务配置**:通常采用编程式事务管理或声明式事务管理,通过 @Transactional 注解来控制事务的边界。 5. **Controller层**:在 Controller 中调用 Service 层方法,传递参数并返回结果,由 Spring MVC 负责视图...

    bsm/ use mybatis

    4. **事务控制**:根据项目需求,可能采用编程式事务管理或者基于Spring的声明式事务管理,确保数据的一致性。 5. **性能优化**:MyBatis允许使用预编译的SQL语句(PreparedStatement),减少解析和编译时间,提高...

    韩顺平hibernate笔记及图解

    在Java应用中,通常使用容器管理的事务(CMT),在Spring框架中则常采用编程式事务管理。事务是数据库操作的基本单元,确保数据的一致性和完整性。 【实体关系】 Hibernate支持多种对象关系映射,如一对一、一对多...

    myibatis 3 进行crud 简单列子 附mysql脚步

    在Spring环境中,通常采用编程式事务管理或声明式事务管理,确保数据的一致性。 综上所述,MyBatis 3 提供了一种简单而强大的方式来进行数据库操作。通过学习这个简单的示例,你可以理解其基本操作流程,并以此为...

    MyBatis Spring声明式事务管理示例代码

    而且编程式事务管理会造成事务管理代码和被管理的代码耦合,不符合软件工程中“高内聚、低耦合”的要求。若采用AOP,则可以避免以上缺陷。 作者博客的示例代码:http://legend2011.blog.51cto.com/3018495/1239139。

    spring声明式事务配置

    Spring框架提供了两种主要类型的事务管理方式:编程式事务管理和声明式事务管理。声明式事务管理通过XML配置或注解的形式定义事务边界,使得业务逻辑与事务控制分离。 ### 描述分析:XML配置示例 提供的XML配置...

    ibatis事务控制案例

    编程式事务管理需要在代码中手动开启、提交和回滚事务,而声明式事务管理则依赖于Spring等框架进行配置。 **3. 编程式事务管理** 在Java中,你可以使用`java.sql.Connection`对象来管理事务。在业务逻辑代码中,你...

    spring事务总结.docx

    然而,在实际开发过程中,经常会遇到一些关于Spring事务的问题,如事务失效、事务回滚、大事务问题以及编程式事务等。本文将深入探讨这些问题,并给出相应的解决方案。 #### 一、事务不生效的原因及解决办法 1. **...

    spring3、 hibernate4 配置声明式事务管理(annotation方式)

    编程式事务管理需要在代码中显式地调用开始、提交、回滚等事务操作,而声明式事务管理则是通过配置或注解来定义事务边界,更加简洁且易于维护。 1. 声明式事务管理的优势: - 将事务管理逻辑与业务逻辑分离,降低...

    spring事务配置详解

    Spring 提供了多种方式来配置事务管理,主要分为编程式事务管理和声明式事务管理。下面将详细介绍这五种Spring 事务配置方式。 1. **基于AOP代理的声明式事务** 这是最常见的配置方式,通过AOP代理在方法调用前后...

    Spring事务配置的五种方式

    编程式事务管理允许在代码中显式地开始、提交、回滚事务。这种方式通常在需要更细粒度控制事务时使用。例如,可以使用PlatformTransactionManager接口的begin、commit和rollback方法来管理事务。 5. **XML配置的...

    Spring 整合mybatis(注解&xml版声明式事务).pdf

    如果采用XML配置方式,则需要在Spring的XML配置文件中进行事务配置,并通过aop命名空间来定义事务通知及切点,从而实现声明式事务管理。 对于开发者而言,Spring与MyBatis的整合简化了事务和持久层的处理,减少了...

Global site tag (gtag.js) - Google Analytics