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

hibernate拦截器

阅读更多

在后端逻辑开发过程中,必然有数据的字段是重复的,是需要保存的,比如当前用户修改了订单,需要记录修改人,修改时间等信息至数据库中,此时没有引用hibernate拦截器时,是需要在每个方法里面都添加对应的代码,记录修改人,修改时间等等字段信息,对这些公用信息每个修改操作都得重复复制,比如在大型电子商务网站中,就必然涉及到很多操作,表结构成百上千,就得在成百上千的后台代码都复制同样的代码进行赋值。

先不说工作量多少,没多少工作量,就是复制下就可。至少这个会多很多不必要的代码,对于系统架构来说,这个就需要在一开始就处理好。此时正好hibernate拦截器就出现了。同时这个拦截器不会对系统造成任何影响,可以随时剔除,同时也不会对框架整体性造成错误影响,完全是个即插即用的。

package com.todaysteel.esaasfront.whs.common;


import java.io.Serializable;
import java.util.Date;

import org.apache.log4j.Logger;
import org.hibernate.EmptyInterceptor;
import org.hibernate.type.Type;
import org.springframework.stereotype.Component;

import com.todaysteel.core.utils.security.SpringSecurityUtils;
import com.todaysteel.esaasfront.publiccloud.commom.security.vo.Authorization;

/**
 * @author liuhaixiao
 * hibernate拦截器:
 * 实现创建人,创建时间自动注入;
 * 修改人,修改时间自动注入;
 */
@Component
public class PropertyInterceptor extends EmptyInterceptor {

	private static final Logger log = Logger.getLogger(PropertyInterceptor.class);
	private static final long serialVersionUID = 1L;


	@Override
	public boolean onSave(Object entity, Serializable id, Object[] state,
		String[] propertyNames, Type[] types) {
		log.info("------Hibernate Interceptor-----onSave-----");
		Authorization user = SpringSecurityUtils.getCurrentUser();
		//添加数据
		for (int index=0;index<propertyNames.length;index++) {
			//找到名为"添加日期"的属性
			if ("dadddate".equals(propertyNames[index])) {
	             //使用拦截器将对象的"添加日期"属性赋上值
	        	if(state[index]==null){
	        		state[index] = new Date();
	        	}
	            continue;
	        } else if ("saddoperator".equals(propertyNames[index])) {//找到名为"添加人"的属性
	        	//使用拦截器将对象的"添加人"属性赋上值
	        	if(state[index]==null){
	        		state[index] = user.getUsername();
	        	}
	            continue;
	        } 
		}
		return true;
	}


	@Override
	public boolean onFlushDirty(Object entity, Serializable id,
			Object[] currentState, Object[] previousState,
			String[] propertyNames, Type[] types) {
		log.info("------Hibernate Interceptor-----onFlushDirty-----");
		Authorization user = SpringSecurityUtils.getCurrentUser();
		//添加数据
	     for (int index=0;index<propertyNames.length;index++) {
	         /*找到名为"修改时间"的属性*/
	         if ("dmodifydate".equals(propertyNames[index])) {
	             /*使用拦截器将对象的"修改时间"属性赋上值*/
	        	 currentState[index] = new Date();
	             continue;
	         } else if ("smodifyoperator".equals(propertyNames[index])) {/*找到名为"修改人"的属性*/
	             /*使用拦截器将对象的"修改人"属性赋上值*/
	        	 currentState[index] = user.getUsername();
	        	 continue;
	         } 
	     }
	
		 return true;
	}

}

 hibernate提供了很多拦截器,在实际需要用到时才查看源码,类似于spring的AOP机制。

同理对电子商务网站需要监控日志的内容同样可以用此拦截器进行跟踪用户的行为。

当然最好是用AOP来处理跟踪用户的日志行为。

 

由于我是采用配置的方式来采用拦截器,所以需要在xml中进行配置。

<!-- 自定义hibernate属性拦截器 -->
	<bean id ="proInterceptor" class="com.todaysteel.esaasfront.whs.common.PropertyInterceptor" />

	<!-- Hibernate配置 -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="DynamicDataSource" />
		<property name="namingStrategy">
			<bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">${hibernate.dialect}</prop>
				<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
				<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
				<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
				<prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache/ehcache-hibernate-local.xml</prop>
			</props>
		</property>
		<property name="packagesToScan" value="com.todaysteel.esaasfront,com.todaysteel.core.business" />
		<property name="entityInterceptor" ref="proInterceptor"/>
	</bean>

 我把这个拦截器的作用域是放在session级别的,所以配置在sesisonFactory上。

 

 

 

 

 

 

分享到:
评论

相关推荐

    Hibernate事件框架之拦截器使用源代码

    ### Hibernate 拦截器使用详解 在 Java 开发领域,Hibernate 是一款非常流行的 ORM(对象关系映射)框架,它极大地简化了基于 JDBC 的数据库访问。为了更好地控制持久化行为,Hibernate 提供了一个强大的事件处理...

    hibernate显示不带?的完整sql

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库操作。在开发过程中,为了调试和优化SQL查询,有时我们需要查看Hibernate生成的完整SQL语句,包括其参数...

    SpringMVCHibernate实例【含登录拦截器例子】

    通过这个实例,你可以学习如何整合 Spring MVC 和 Hibernate,实现用户登录验证,以及如何设计和配置拦截器来增强应用的安全性。此外,你还能了解到如何组织一个标准的 Java Web 项目结构。这些知识对于理解企业级 ...

    hibernate 2 升级参考文档

    在进行以上步骤的同时,还需要注意检查任何自定义的Hibernate拦截器、事件监听器或者其他扩展是否兼容Hibernate 3。另外,确保所有使用的API和方法在新版本中仍然可用,因为某些API在不同版本之间可能会被废弃或修改...

    hibernate框架基本包

    - **Hibernate拦截器**: 类似于监听器,但更灵活,可以直接修改对象的状态。 总结来说,“hibernate框架基本包”包含的资源旨在帮助开发者理解Hibernate的核心概念、操作和配置,以及如何在实际项目中有效利用它。...

    hibernate 3.5.5 常用jar包

    15. **Hibernate拦截器**:提供了更细粒度的控制,可以在对象的持久化操作前后进行干预。 16. **实体关系映射策略**:包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)...

    Hibernate的demo

    1. **Hibernate拦截器** Hibernate提供了一种机制,即拦截器(Interceptor),可以在特定的生命周期事件(如加载、保存、更新、删除等)前后执行自定义逻辑。拦截器可以用来实现诸如日志记录、权限验证等额外功能。...

    hibernate+struts2全套架包

    - 拦截器配置:在Struts2中添加Hibernate拦截器,以处理Session的生命周期,例如,开启事务、提交或回滚等。 - 实现业务逻辑:在Action类中注入SessionFactory,通过Session执行数据库操作,使用Query接口执行查询...

    Hibernate与Struts 2整合,学生选课系统源代码

    整合过程包括在Struts 2配置文件中添加Hibernate拦截器,配置数据源,以及在Action类中注入Hibernate的SessionFactory和服务层组件。 4. **数据库设计**:实验中涉及到的数据库表包括学生表、专业表、课程表、登录...

    拦截器和控制器的区别

    拦截器和过滤器的区别 1、拦截器基于动态代理 , 过滤器基于函数回调 2、拦截器不依赖于servlet容器,通过动态代理实现,过滤器依赖于servlet容器 3、拦截器在方法前后,异常前后等调用,而过滤器只能在请求前和请求...

    Struts1 拦截器(SAIF)的使用

    Struts1 框架是Java Web开发中的一个经典MVC框架,它的核心组件之一就是拦截器(Interceptor)。拦截器在Struts1中扮演着重要角色,它允许开发者在动作执行前后插入自定义的逻辑,比如日志记录、权限验证、事务管理...

    hibernate_persistence第02-16章书中源码

    Hibernate拦截器允许我们在实体的生命周期事件中插入自定义行为,如在保存、更新或删除实体前/后执行某些操作。这在日志记录、权限控制等场景非常有用。 5. **hibernate_09_006_Procedure**: 在这一章,可能会...

    spring hibernate实现动态替换表名(分表)的方法

    首先,我们需要新建一个 Hibernate 拦截器类,用于拦截所有数据库操作,并替换掉其中的表名。 ```java public class AutoTableNameInterceptor extends EmptyInterceptor { private String srcName = StringUtils....

    Spring3+Dwr+JdbcTemplate(拦截器方式实现防止重复提交)

    1.针对SpringMVC注解的配置,可起到入门的作用 2.Spring+JdbcTemplate事物管理 3.Spring+Hibernate事物管理 ...5.Spring配置拦截器 6.Spring通过拦截器实现防止重复提交实例 对学习,会起到非常好的效果

    登录拦截器

    在Spring、Struts2和Hibernate这三大框架的组合应用中,登录拦截器的作用尤为显著,它能确保只有经过身份验证的用户才能访问受保护的页面或执行特定的业务操作。 首先,让我们来理解一下这三个框架的角色: 1. **...

    给hibernate配置文件加密解密的方案

    Hibernate 配置文件加密解密方案 在本文中,我们将讨论如何在 Hibernate 配置文件中对数据库密码进行加密和解密,以保护数据的安全。该方案通过使用 Java 的 Cipher 类和 DES 对称加密算法来实现加密和解密操作。 ...

    ssh+aop+log4j+日志拦截器+注解

    标题中的"ssh+aop+log4j+日志拦截器+注解"涉及到的是Java Web开发中的几个核心组件和技术,这些技术在构建大型、分布式的企业级应用时常常被使用。下面将详细介绍这些知识点: 1. SSH (Spring, Struts, Hibernate)...

    ssh最新框架搭建,加入拦截器

    在这个"ssh最新框架搭建,加入拦截器"的主题中,我们将深入探讨SSH框架的搭建过程以及如何添加拦截器来增强功能。 首先,让我们从Spring框架开始。Spring是核心,它提供依赖注入(DI)和面向切面编程(AOP)的功能,...

    登陆拦截器

    2. **配置拦截器**:在Struts2的配置文件(如struts.xml)中,你需要声明你的拦截器,并将它添加到拦截器栈中。例如: ```xml &lt;result name="success"&gt;/welcome.jsp &lt;result name="error"&gt;/login.jsp...

    2012最新ssh2框架-struts2.3+hibernate4.1+spring3.1登录+注册+拦截器+分页

    2012最新ssh2框架-struts2.3+hibernate4.1+spring3.1登录+注册(md5加密)带拦截器,mysql数据库,带分页功能, 只需修改com/resource/resourses.properties数据库连接即可使用

Global site tag (gtag.js) - Google Analytics