`
liufei.fir
  • 浏览: 686106 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

用过滤器管理hibernate的session及Transaction事务

阅读更多
过滤器:
package org.liufei.filters;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.liufei.hibernateUtil.*;
/**
* 这样使用Hibernate时更娇方便了,不用每次为创建SessionFactory实例,Session实例或关闭Session实例以及打开或者关闭事务等操作单独写代码了,
* 只要调用上面类的方法就行,从而简化操作
*
* @author 刘飞
*
*/
public class CloseSessionFilter implements Filter{
Log loger = LogFactory.getLog(this.getClass()) ;

protected FilterConfig config ;

public void destroy() {
this.config = null ;
}

/**
* doFilter方法,定义操作
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try{
chain.doFilter((HttpServletRequest)request, (HttpServletResponse)response) ;
}finally{
try{
HibernateSession.commitTransaction() ; //提交事务
}catch(Exception e){
HibernateSession.rollbackTransaction() ; //回滚事务
}finally{
HibernateSession.closeSession() ; //关闭Session
}
}
}

/**
* 初始化方法
*/
public void init(FilterConfig filterConfig) throws ServletException {
this.config = filterConfig ;
}

}
Session工厂:
package org.liufei.hibernateUtil;

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


/**
* 因为在一次请求中需要共享单一的Session和Transation实例,因此不能在每个方法后关闭Session,应该在一次请求全部处理完成后关闭Session。
* 为此可以设计一个过滤器,在过滤器中同意关闭Session,实现该功能的Filter(CloseSessionFilter)
*
* @author 刘飞
*
*/
public class HibernateSession {

private static final SessionFactory sessionFactory ;
static{
try{
/**
* 创建SessionFactory对象
*/
sessionFactory = new Configuration().configure().buildSessionFactory() ;
}catch (Throwable e) {
System.out.println("初始化 Sessionfactory 对象失败!!") ;
e.printStackTrace() ;
throw new ExceptionInInitializerError(e) ;
}
}
public static final ThreadLocal<Session> tLocalsess = new ThreadLocal<Session>() ;
public static final ThreadLocal<Transaction> tLocaltx = new ThreadLocal<Transaction>() ;

/**
* 取得Session对象
* @return Session
*/
public static Session currentSession(){
Session session = (Session)tLocalsess.get() ;

try{
if(session == null || !session.isOpen()){
session = openSession() ;
tLocalsess.set(session) ;
}
}catch (HibernateException e) {
System.out.println("无法获取Session对象!!") ;
e.printStackTrace() ;
}
return session ;
}

/**
* 关闭当前<tt>Session</tt>
*/
public static void closeSession(){
Session session = (Session)tLocalsess.get() ;
tLocalsess.set(null) ;
try{
if(session != null && session.isOpen()){
session.close() ;
}
}catch(HibernateException e){
System.out.println("关闭Session异常!!") ;
e.printStackTrace() ;
}
}

/**
* 开启事务
*/
public static void beginTransaction(){
//声明Transaction类型对象tx,并赋初值
Transaction tx = (Transaction)tLocaltx.get() ;
try{
if(tx == null){
tx = currentSession().beginTransaction() ;
tLocaltx.set(tx) ;
}
}catch(HibernateException e){
System.out.println("打开事务失败!!") ;
e.printStackTrace() ;
}
}

/**
* 关闭事务
*/
public static void commitTransaction(){
Transaction tx = (Transaction)tLocaltx.get() ;
try{
if(tx != null && !tx.wasCommitted() && !tx.wasRolledBack()){
tx.commit() ;
}
tLocaltx.set(null) ;
System.out.println("Commit Transaction!!") ;
}catch(HibernateException e){
System.out.println("提交并关闭事务异常!!") ;
e.printStackTrace() ;
}
}

/**
* 回滚当前事务
*/
public static void rollbackTransaction(){
Transaction tx = (Transaction)tLocaltx.get() ;
try{
tLocaltx.set(null) ;
if(tx != null && !tx.wasCommitted() && !tx.wasRolledBack()){
tx.rollback() ;
}
}catch(HibernateException e){
System.out.println("事务回滚异常!!") ;
e.printStackTrace() ;
}
}

/**
* 返回Session对象
* @return Session
* @throws HibernateException
*/
public static Session openSession() throws HibernateException{
return getSessionFactory().openSession() ;
}

/**
* 返回SessionFactory对象
* @return SessionFactory
* @throws HibernateException
*/
public static SessionFactory getSessionFactory() throws HibernateException {
return sessionFactory ;
}

}
过滤器配置:
<filter-mapping>
<filter-name>CloseSessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


<filter-mapping>
<filter-name>SetCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

使用范例:
package org.liufei.Actions;

import java.util.List;

import javax.servlet.http.HttpSession;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.liufei.entityBeans.Admin;
import org.liufei.entityBeans.GeneralManager;
import org.liufei.hibernateUtil.DetachedCriteriaList;
import org.liufei.hibernateUtil.HibernateSession;

public class LoginAction extends BaseAction {
/**
*
*/
private static final long serialVersionUID = 1L;
private String usersname;
private String userspassword;
private String validtaCode;
private String usercategory;

//HttpSession session = getSession() ; //获取HttpSession对象
Session s = HibernateSession.currentSession() ;
DetachedCriteriaList detachedCriteriaList = new DetachedCriteriaList() ;

public String getUsersname() {
return usersname;
}

public void setUsersname(String usersname) {
this.usersname = usersname;
}

public String getUserspassword() {
return userspassword;
}

public void setUserspassword(String userspassword) {
this.userspassword = userspassword;
}

public String getValidtaCode() {
return validtaCode;
}

public void setValidtaCode(String validtaCode) {
this.validtaCode = validtaCode;
}

public String getUsercategory() {
return usercategory;
}

public void setUsercategory(String usercategory) {
this.usercategory = usercategory;
}

@Override
public String execute() throws Exception {
String str ;
String loginFlag = null ;
int loginSort = Integer.parseInt(getUsercategory()) ;
try{
HibernateSession.beginTransaction() ;
switch (loginSort) {
case 1:
str = " from Admin as admin where admin.name=:adminName and admin.password=:adminPassword" ;
Query query1 = s.createQuery(str) ;
query1.setString("adminName", usersname) ;
query1.setString("adminPassword", userspassword) ;
List<?> list1 = query1.list() ;
if(list1.size() > 0){
//session.setAttribute("adminID", ((Admin)list1.get(0)).getId()) ;
//session.setAttribute("adminname", ((Admin)list1.get(0)).getName()) ;
//session.setAttribute("adminCon", ((Admin)list1.get(0)).getManagers()) ;
//s.close() ;
loginFlag = "loginAdminSuccess" ;
}else{
loginFlag = "loginAdminError" ;
addFieldError(usersname, "超级管理员姓名或密码输入错误!!") ;
addActionError("超级管理员姓名或密码输入错误!!") ;
System.out.println("超级管理员姓名或密码输入错误!!") ;
}
break;
case 2:
str = " from GeneralManager as manager where manager.name=:managerName and manager.password=:managerPassword" ;
Query query2 = s.createQuery(str) ;
query2.setString("managerName", usersname) ;
query2.setString("managerPassword", userspassword) ;
List<?> list2 = query2.list() ;
if(list2.size() > 0){
//session.setAttribute("managerID", ((GeneralManager)list2.get(0)).getId()) ;
//session.setAttribute("managername", ((GeneralManager)list2.get(0)).getName()) ;
//session.setAttribute("managerAdmin", ((GeneralManager)list2.get(0)).getAdmin()) ;
//session.setAttribute("managerCon", ((GeneralManager)list2.get(0)).getContactUsers()) ;
//s.close() ;
loginFlag = "loginManagerSuccess" ;
}else{
loginFlag = "loginManagerError" ;
addFieldError(userspassword, "管理员姓名或密码输入错误!!") ;
addActionError("管理员姓名或密码输入错误!!") ;
System.out.println("管理员姓名或密码输入错误!!") ;
}
break;

default:
break;
}

}catch(HibernateException e){
System.out.println("登录失败!!") ;
e.printStackTrace() ;
}

return loginFlag ;
}

@Override
public void validate() {

if (this.usersname == null || this.usersname.trim().length() < 1) {
addFieldError("username","用户名不能为空!!") ;
}
if (this.userspassword == null
|| this.userspassword.trim().length() < 1) {
addFieldError("userpassword","密码不为空!!") ;
}


}

}
分享到:
评论

相关推荐

    Hibernate权限管理例子

    这通常在Controller层或者过滤器中进行,通过查询数据库来检查当前用户是否有执行特定操作的权限。 总结起来,这个“Hibernate权限管理例子”展示了如何使用Hibernate注解来构建一个基本的权限管理系统,包括用户、...

    Hibernate In Action(Java.Persistence.with.Hibernate)源码

    不依赖于JPA的情况下,开发者可以直接使用Hibernate的核心API进行数据库交互,如Session、Transaction、Criteria API或HQL(Hibernate Query Language)。这部分代码可能会展示如何进行对象的保存、更新、删除,以及...

    hibernate学习文档

    - **Transaction**:事务管理器,用于控制事务的开始、提交和回滚等操作。 ##### 2.2 配置文件 Hibernate 使用 XML 文件进行配置,其中最重要的配置文件为 `hibernate.cfg.xml`。该文件定义了 Hibernate 连接...

    java私塾独家首发最新Hibernate4教程

    其中SessionFactory是创建Session的工厂,Session则是与数据库进行交互的主要接口,Transaction用于管理事务。 #### 二、Hibernate4的基础配置与开发 **2.1 基础配置** - **cfg.xml**:这是Hibernate4的主配置...

    hibernate面试题总结

    - **OpenSessionInView**:是一种设计模式,用于Web应用中,通过过滤器在请求开始时打开`Session`,结束时关闭,确保整个请求过程中`Session`可用,从而支持延迟加载。但这种方法可能导致过多的数据库连接,因此也...

    Hibernate3.5官方开发文档pdf + html

    15. **扩展性与插件**:了解Hibernate的可扩展性,如拦截器(Interceptors)、过滤器(Filters)以及第三方插件如Hibernate Search(全文检索)。 这些知识点覆盖了Hibernate 3.5的核心功能,开发者可以通过官方...

    Spring/泛型Hibernate的实现

    最后,配置了Hibernate事务管理器`transactionManager`,以及使用AOP方式开启事务管理。 #### 三、Maven构建工程 Maven是一个项目管理和构建工具,能够帮助开发者自动化构建过程,简化依赖管理。在本案例中,我们...

    Hibernate API

    12. `disableFilter(String filterName)` 和 `enableFilter(String filterName)`:这两个方法用于启用或禁用Session中的过滤器。过滤器允许在查询执行前对结果进行额外的限制。 13. `disconnect()`:断开Session与...

    struts2和hibernate整合

    可以使用Hibernate的Transaction API或Spring的@Transactional注解。 3. **异常处理**:正确捕获和处理可能出现的异常,提供友好的错误提示。 4. **性能优化**:合理使用缓存,避免过多的数据库查询。考虑使用懒...

    Struts+Hibernate管理Emp和Dept

    最后,项目还需要一个Web.xml文件,配置Servlet容器中的监听器、过滤器和Servlet,以启动Struts和Hibernate的初始化过程。 综上所述,"Struts+Hibernate管理Emp和Dept"项目利用了Struts的MVC架构处理HTTP请求,通过...

    SpringMvc(4.0)+hibernate(4.0)

    在这个项目中,Hibernate 4.0 被用来管理数据库操作,包括创建、读取、更新和删除(CRUD)数据,通过 Session 和 Transaction API 进行事务处理。 【项目结构】 项目结构通常包含以下几个部分: 1. src/main/java:...

    hibernate框架需要的全部jar文件

    - 查询:使用HQL(Hibernate Query Language)或Criteria API进行复杂查询,支持分页、排序、条件过滤等。 8. **事务管理** Hibernate支持编程式和声明式事务管理。`Transaction`接口用于控制事务的开始、提交、...

    SpringMVC +Security+Hibernate

    在学习过程中,可以深入研究每个框架的核心概念,例如SpringMVC的DispatcherServlet、HandlerMapping和ViewResolver,Spring Security的Filter Chain,以及Hibernate的Session和Transaction管理。同时,也可以尝试...

    hibernate3.6基本jar包

    这个jar包是使用Hibernate进行数据持久化操作的基础,包含了Entity、SessionFactory、Session、Query等核心类。 2. **javassist-3.12.0.GA.jar**:这是一个动态类库,用于在运行时修改或生成类。在Hibernate中,它...

    Struts2整合hibernate所需的jar包

    - 使用Struts2的拦截器链进行事务管理,通常使用Spring提供的`transaction`拦截器。 3. **注意事项**: - 确保所有jar包版本兼容,避免因版本不匹配导致的问题。 - 检查数据库驱动是否正确,避免连接失败。 - ...

    Hibernate学习.pdf

    - **Session**: Hibernate进行所有数据库操作的基本上下文环境,是线程不安全的,每次操作都应打开新的Session,并在操作完成后关闭它。 - **Transaction**: 事务控制。 - **Query**: 查询操作。 - **Configuration*...

    springmvc+hibernate

    在 Spring 应用中集成 Hibernate,通常会使用 Spring 的 DAO(数据访问对象)支持,将 Hibernate Session 和 Transaction 管理纳入 Spring 的管理范围。spring-application.xml 和 spring-servlet.xml 都是 Spring ...

    hibernate3.6中文手册

    9. **其他高级特性**:涵盖了如查询缓存、事件监听器、过滤器、子查询等高级特性,帮助开发者深入挖掘Hibernate的潜力。 10. **实例分析**:手册通常会包含大量示例代码,通过实际应用场景的演示,帮助读者理解并...

    hibernate v3.04中文参考手册

    Hibernate是一款强大的Java对象关系映射(ORM)框架,它极大地简化了数据库操作,让开发者可以使用面向对象的方式来处理数据库事务。本手册是针对Hibernate 3.04版本的详尽指南,旨在帮助Java开发者深入理解和应用...

    hibernate必需的jar包

    - `jta.jar`:Java Transaction API,用于管理事务,确保数据的一致性和完整性。 - `dom4j.jar`:XML处理库,Hibernate使用它来读写XML配置文件和映射文件。 - `commons-collections.jar`:Apache Commons ...

Global site tag (gtag.js) - Google Analytics