- 浏览: 467635 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (371)
- Java (44)
- Flex (25)
- Design Pattern / UML (5)
- JVM (14)
- Software Engineer (4)
- Testing (30)
- Web Backend (60)
- Linux (7)
- Database (11)
- SOA (28)
- English (6)
- FX (5)
- SAP Support (25)
- SAP Development (5)
- SAP Impl & Oprn (8)
- Articles (15)
- Music (4)
- Recipe (14)
- Multi-thread (4)
- Lucene (2)
- CS basic / Algorithm (12)
- Tour (3)
- C C++ (21)
- Others (10)
- Code Repository C++ (1)
- Code Repository Java (1)
- Code Repository Algorithm (1)
- Code Repository SQL (1)
- Web Frontend (4)
最新评论
-
xiangxm:
Java 强引用、 软引用、 弱引用、虚引用 -
nml-lyb:
123
Mule 的第一个例子 -
nml-lyb:
http://www.baidu.com
Mule 的第一个例子 -
white___ant:
...
Java 强引用、 软引用、 弱引用、虚引用 -
joeyon:
...
Java NIO介绍
=============== 采用编程式事务 =====================
引入这个机制的情况:系统日志在hibernate存入数据库的时候,涉及到 tbluser 和 tbllog 两个表。这两个表要么同时存入数据,要么同时不存入。所以把这两个表的操作 放到一个事务中。
(系统日志 区别与 编程常用的 调试日志,调试日志 是输出到文件或者控制台 的。他们的作用也不一样)
本例子中,和之前hibernate的例子比较,改动地方如下(本例子中,没有涉及到spring):
a、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>
b、UserManagerImpl.java
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
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);
}
}
}
LogManagerImpl.java
import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.util.HibernateUtils;
public class LogManagerImpl implements LogManager {
public void addLog(Log log) {
// 这里拿到的session 是 和 上面的 一样的session
HibernateUtils.getSessionFactory().getCurrentSession()
.save(log);
}
}
下面是 视频 中的总结:
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>
=============== 采用声明式事务 =====================
编写业务逻辑方法:
* 继承HibernateDaoSupport类,使用HibernateTemplate来持久化,HibernateTemplate是
Hibernate Session的轻量级封装
* 默认情况下运行期异常
才会回滚(包括继承了RuntimeException子类),普通异常
是不会滚的
* 编写业务逻辑方法时,最好将异常一直向上抛出,在表示层(struts)处理
* 关于事务边界的设置,通常设置到业务层
,不要添加到Dao上
相关的类如下:
UserManagerImpl.java(这个类可以理解为BO,实现业务逻辑。对象的保存功能应该放到DAO中,这里直接存是为了方便)
import java.util.Date;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.model.User;
import com.bjsxt.usermgr.util.HibernateUtils;
public class UserManagerImpl extends HibernateDaoSupport implements UserManager {
private LogManager logManager;
public void addUser(User user) {
this.getHibernateTemplate().save(user); // 在这个方法调用之前,就已经启动了 事务
Log log = new Log();
log.setType("安全日志");
log.setDetail("xxx进入系统");
log.setTime(new Date());
logManager.addLog(log); // 这个方法中存储动作,使用的是一个事务
throw new java.lang.RuntimeException();
}
/* 这里是 通过抛出异常 做 回滚 测试
public void addUser(User user)
throws Exception {
this.getHibernateTemplate().save(user);
Log log = new Log();
log.setType("安全日志");
log.setDetail("xxx进入系统");
log.setTime(new Date());
logManager.addLog(log);
throw new Exception();
}*/
public void setLogManager(LogManager logManager) {
this.logManager = logManager;
}
}
LogManagerImpl.java
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.util.HibernateUtils;
public class LogManagerImpl extends HibernateDaoSupport implements LogManager {
public void addLog(Log log) {
this.getHibernateTemplate().save(log);
}
}
Client.java
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
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("张三");
// 注意这里的写法
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext-*.xml");
UserManager userManager = (UserManager)factory.getBean("userManager");
try {
userManager.addUser(user);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
spring的配置文件 按照功能 分两块写,
applicationContext-Common.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!-- 配置sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value> // 这里的 hibernate配置,在另外一个文件中
</property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<!-- 配置事务的传播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/> // 其他类型的 传播特性 很少用到
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="modify*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/> //意思是 除了上面三个方法外,其他方法都是”只读“,这样就不用开启 事务 , 可以提高运行效率。
</tx:attributes>
</tx:advice>
<!-- 那些类的哪些方法参与事务 -->
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* com.bjsxt.usermgr.manager.*.*(..))"/>
<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>
</aop:config>
</beans>
applicationContext-beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean id="userManager" class="com.bjsxt.usermgr.manager.UserManagerImpl">
<property name="sessionFactory" ref="sessionFactory"/>
<property name="logManager" ref="logManager"/>
</bean>
<bean id="logManager" class="com.bjsxt.usermgr.manager.LogManagerImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>
发表评论
-
Servlet Async
2015-05-15 02:29 465http://www.importnew.com/8864. ... -
EHcache
2014-09-06 23:32 495http://blog.csdn.net/liuzhenwe ... -
Maven构建并热部署一个简略的Web Project
2014-08-01 01:51 707zz from : http://www.myexcept ... -
Tomcat 权限配置,当使用Eclipse启动时都会被修改为默认
2014-07-31 07:57 514http://zhidao.baidu.com/link?u ... -
解决tomcat占用8080端口问题图文教程
2014-07-30 21:59 599zz from http://jingyan.baidu. ... -
HttpURLConnection用法详解
2013-09-04 02:08 644http://www.cnblogs.com/guodong ... -
使用HttpSessionListener接口监听Session 的创建和失效
2013-09-03 03:55 789http://uule.iteye.com/blog/824 ... -
web.xml 中的listener、 filter、servlet 加载顺序及其详解
2013-09-03 03:49 336http://www.cnblogs.com/JesseV/ ... -
servlet listener
2013-09-03 03:43 624http://sakyone.iteye.com/blog/ ... -
servlet filter
2013-09-03 03:42 678http://sakyone.iteye.com/blog/ ... -
Servlet中Request的getAttribute getParameter 区别
2013-08-29 12:31 1077http://blog.csdn.net/yangqillo ... -
用windows启动tomcat
2013-07-04 09:36 616services.msc -
Spring 加载 application.xml 出错FileNotFoundException
2013-06-23 21:26 919http://zhidao.baidu.com/questi ... -
<context-param>与<init-param>的区别与作用
2013-06-18 08:08 682http://www.cnblogs.com/hzj-/ar ... -
HttpWatch工具简介及使用技巧
2012-05-09 14:13 3882http://cfeng518.blog.163.com/bl ... -
Web Service (Axis2实现)
2012-04-19 11:13 1293转载from http://wangyaobeiji ... -
Tomcat4 源代码分析 (20) How Tomcat Works 第二十章
2009-07-27 17:24 875Chapter 20 : JMX-Based Manageme ... -
Tomcat4 源代码分析 (19) How Tomcat Works 第十九章
2009-07-27 17:19 753Chapter 19 : Manager Servlet ... -
Tomcat4 源代码分析 (18) How Tomcat Works 第十八章
2009-07-27 16:58 793Chapter 18 : Deployer T ... -
Tomcat4 源代码分析 (17) How Tomcat Works 第十七章
2009-07-24 17:57 1040Chapter 17 : Tomcat Startup ...
相关推荐
**Spring 3.0新特性详解** Spring框架作为Java企业级应用开发的基石,自发布...文件`SXT_Spring3_02`和`SXT_Spring3_01`可能涵盖了Spring 3.0的基础概念和使用方法,对于深入理解和使用这个版本的Spring框架至关重要。
<bean id="productImpl" class="com.sxt.spring.model.impl.ProductImpl" /> <bean id="userImpl" class="com.sxt.spring.model.impl.UserImpl" /> <!-- 通知对象Advice --> <bean id="afterAdvice" class="com.sxt...
【sxt Video File】是一种专为视频开发设计的文件格式,它被广泛应用于多媒体内容的存储和传输。这种格式可能包含一系列技术规格和编码标准,旨在优化视频质量和压缩效率,同时便于开发人员进行集成和处理。在【描述...
标题 "sxt.rar_sxt" 暗示我们正在处理一个RAR压缩文件,其中包含一个名为"sxt"的项目。这个文件很可能是一个使用Visual C++(VC++)编写的程序,目的是实现无须额外驱动就能访问和操作摄像头的功能。在Windows环境中...
《SXT--RBAC权限控制系统源码解析》 在信息技术领域,权限控制是系统安全的重要组成部分,它确保了用户只能访问他们被授权的资源。本文将深入探讨SXT--RBAC(Role-Based Access Control,基于角色的访问控制)权限...
在进行mikrotik SXT网桥点对点安装时,我们首先需要了解网桥设备以及点对点连接的定义。网桥是一种网络设备,主要用于连接两个或多个局域网(LAN)段,允许不同网络段中的设备相互通信。在无线通信领域,点对点...
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=...
很抱歉,但根据您给出的信息,标题"‘SXT_ksxt_’"和描述"‘加热后软件恶霸vi热v贵部 将二姑vUI热 进欧冠ire’"似乎包含了一些难以理解的词汇,它们可能不是标准的IT术语或者描述。标签"‘ksxt’"看起来像是简写或...
package cn.sxt.dynamicproxy; import java.util.ArrayList; import java.util.List; import cn.sxt.service.UserService; import cn.sxt.service.UserServiceImpl; public class Client { public ...
【SXT Shell:一个自动化安装脚本的探索】 在IT行业中,自动化是提高效率的关键,尤其是在服务器管理和维护中。SXT Shell(SXTshell)是一个专门为实现自动化部署和配置而设计的脚本工具。它旨在简化系统管理员的...
此外,Spring的事务管理可以在Service层的方法上添加@Transactional注解,实现事务的自动管理。 在实际开发中,S2sh-sxt可能包含了示例项目的所有源码、配置文件、数据库脚本以及相关的文档。开发者可以参考这些...
sxt\weblogic\weblogic安装.avi sxt\weblogic\weblogic安装.avisxt\weblogic\weblogic安装.avi sxt\weblogic\weblogic安装.avi
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:c=...
sxt_api_14.jar,便于下载可以使用
"sxt66329PPT模板.pptx" 是一款商务用途的PPT模板,适用于各类专业场合。 1. **模板选择与定制**: - 商务模板通常采用简洁、专业且色彩协调的设计,以符合商业环境的正式氛围。"sxt66329" 模板可能包含一系列预设...
正是在这种背景下,刘经理推荐的“sxt+doswin1.zip”压缩包显得尤为珍贵。这个压缩包中包含了两个软件工具,它们分别是SXTPSGJ_V2.1_XiTongZhiJia和doswin1,两者结合使用,为工程师们提供了一个在DOS环境下进行图像...
标题 "sxt.zip_VBa_摄像头" 暗示了这个压缩包可能包含一个使用VBA(Visual Basic for Applications)编程实现的工具或代码,用于访问和操作摄像头。VBA是一种脚本语言,广泛应用于Microsoft Office套件中,如Excel、...
本资源"**sxt.rar_c#扇形图**"提供了一段代码,可以帮助开发者自定义绘制扇形统计图。 在C#中,我们可以利用GDI+(Graphics Device Interface Plus)库来实现图形绘制,包括扇形图。GDI+是.NET Framework的一部分,...
标题 "sxt.rar_c# 摄像头实例" 提供了一个关于使用C#编程语言进行摄像头控制的项目实例。这个实例可能是一个基础的、可运行的代码示例,用于展示如何在C#环境中访问和操作摄像头设备。下面将详细讨论C#中摄像头控制...