- 浏览: 1047961 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1441)
- 软件思想&演讲 (9)
- 行业常识 (250)
- 时时疑问 (5)
- java/guava/python/php/ruby/R/scala/groovy (213)
- struct/spring/springmvc (37)
- mybatis/hibernate/JPA (10)
- mysql/oracle/sqlserver/db2/mongdb/redis/neo4j/GreenPlum/Teradata/hsqldb/Derby/sakila (268)
- js/jquery/jqueryUi/jqueryEaseyUI/extjs/angulrJs/react/es6/grunt/zepto/raphael (81)
- ZMQ/RabbitMQ/ActiveMQ/JMS/kafka (17)
- lucene/solr/nuth/elasticsearch/MG4J (167)
- html/css/ionic/nodejs/bootstrap (19)
- Linux/shell/centos (56)
- cvs/svn/git/sourceTree/gradle/ant/maven/mantis/docker/Kubernetes (26)
- sonatype nexus (1)
- tomcat/jetty/netty/jboss (9)
- 工具 (17)
- ETL/SPASS/MATLAB/RapidMiner/weka/kettle/DataX/Kylin (11)
- hadoop/spark/Hbase/Hive/pig/Zookeeper/HAWQ/cloudera/Impala/Oozie (190)
- ios/swift/android (9)
- 机器学习&算法&大数据 (18)
- Mesos是Apache下的开源分布式资源管理框架 (1)
- echarts/d3/highCharts/tableau (1)
- 行业技能图谱 (1)
- 大数据可视化 (2)
- tornado/ansible/twisted (2)
- Nagios/Cacti/Zabbix (0)
- eclipse/intellijIDEA/webstorm (5)
- cvs/svn/git/sourceTree/gradle/jira/bitbucket (4)
- jsp/jsf/flex/ZKoss (0)
- 测试技术 (2)
- splunk/flunm (2)
- 高并发/大数据量 (1)
- freemarker/vector/thymeleaf (1)
- docker/Kubernetes (2)
- dubbo/ESB/dubboX/wso2 (2)
最新评论
拦截器(Interceptor)
org.hibernate.Interceptor接口定义了Hibernate中通用拦截机制
创建Session对象的时候,所有的Session对象或者这个Session对象的所有持久化操作的动作都会被指定的拦截器进行拦截.
Interceptor接口的方法
afterTransactionBegin()
当一个事务时候启动时,会立刻调用这个方法,这个方法可以改变这个事务的状态,例如:回滚事务
instantiate()
创建对象,如果返回null,则Hibernate将调用实体类的默认构造方法创建持久化对象
getEntity()
当一个持久化对象,通过标示符属性在Session对象的缓存中进行查找,并且没有找到时,会调用该方法
getEntityName()
当session对象获取持久化对象的名字时,会调用这个方法
onLoad()
该方法在持久化对象初始化之前加载,这个的持久化对象处于刚被创建的状态(对象的属性值都未赋值)
findDirty()
当调用Session对象的flush()方法时,讲调用该方法判断对象是否为脏数据,这是脏数据检查的另外拦截的实现方式
isTransient()
当调用Session对象的saveOrUpdate方法时,会调用该方法判断对象是否尚未保存
onSave()
在对象被保存之前调用,通过这个方法可以对要保持的对象的属性进行修改
onDelete()
该方法在持久化对象被删除之前调用
preFlush()
该方法当调用Session对象的flush()方法之前被调用
onFlushDirty()
当调用Session对象flush()方法进行脏数据检查时,如果发现持久化对象的状态发生了改变,会调用该方法
postFlush()
该方法调用Session对象的flush()方法之后被调用
beforeTransactionCompletion()
在完成一个事务之前,调用此方法,这个方法可以改变事务的状态,例如回滚事务
afterTransactionCompletion()
当完成一个事务之后,立刻调用此方法
1、使用拦截器实现操作日志
在应用系统中,对所有的数据库的操作都做记录,记录所操作内容,操作的用户和操作的时间
Java代码 收藏代码
import org.hibernate.CallbackException;
import org.hibernate.EmptyInterceptor;
import org.hibernate.type.Type;
import java.io.Serializable;
import java.util.Date;
public class DaoLogInterceptor extends EmptyInterceptor {
private static final long serialVersionUID = 1L;
@Override
public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
super.onDelete(entity, id, state, propertyNames, types);
}
@Override
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
return super.onSave(entity, id, state, propertyNames, types);
}
@Override
public void onCollectionUpdate(Object collection, Serializable key) throws CallbackException {
super.onCollectionUpdate(collection, key);
}
@Override
public void onCollectionRemove(Object collection, Serializable key) throws CallbackException {
super.onCollectionRemove(collection, key);
}
@Override
public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
return super.onLoad(entity, id, state, propertyNames, types);
}
@Override
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
System.out.println("operateTm:"+entity.getClass().getName()+"--OperateTm:"+new Date()+"--操作用户:当前登录用户");
getOperateDetails(previousState, currentState, propertyNames);
return super.onFlushDirty(entity, id, currentState, previousState, propertyNames, types);
}
/**
* 操作前后的数据差异
*
* @param oldState
* @param state
* @param operateLog
* @return
*/
private void getOperateDetails(Object[] oldState, Object[] state, String[] propertyNames) {
for (int i = 0; i < propertyNames.length; i++) {
if (!equalsObject(oldState[i], state[i])) {
System.out.println("Field:"+propertyNames[i]+"NewValue:"+state[i] +"OldValue:"+oldState[i]);
}
}
}
private boolean equalsObject(Object o1, Object o2) {
if (o1 == null && o2 != null) {
return false;
}
if (o2 == null && o1 != null) {
return false;
}
if (o1 == null && o2 == null) {
return true;
}
return o1.equals(o2);
}
}
Xml代码 收藏代码
<!--hibernate配置-->
<bean id="myInterceptor" class="com.sf.sfbuy2.context.filter.DaoLogInterceptor"/>
<bean id="postUpdateListener" class="com.sf.sfbuy2.context.filter.PostUpdateListener"></bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="entityInterceptor">
<ref bean="myInterceptor" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="use_sql_comments">true</prop>
<prop key="javax.persistence.validation.mode">none</prop>
<prop key="hibernate.validator.apply_to_ddl">false</prop>
<prop key="hibernate.validator.autoregister_listeners">false</prop>
</props>
</property>
<property name="packagesToScan">
<list>
<value>com.sf.sfbuy2.db.entity</value>
</list>
</property>
</bean>
2、Hibernate的事件监听机制
Hibernate中的事件监听机制可以对Session对象的动作进行监听,一旦发生了特殊的事件,Hibernate就会执行监听器中的事件处理方法
在某些功能的设计中,我们即可以使用Hibernate的拦截器实现,也可以使用Hibernate的事件监听来实现
Hibernate中事件与对应的监听器接口
事件类型 监听器接口
auto-flush AutoFlushEventListener
merge MergeEventListener
delete DeleteEventListener
persist PersistEventListener
dirty-check DirtyCheckEventListener
evice EvictEventListener
flush FlushEventListener
flush-entity FlushEntityEventListener
load LoadEventListener
load-collection InitializeCollectEventListener
lock LockEventListener
refresh RefreshEventListener
replicate ReplicateEventListener
save-update SaveOrUpdateEventListener
pre-load PreLoadEventListener
pre-update PreUpdateEventListener
pre-delete PreDeleteEventListener
pre-insert PreInsertEventListener
post-load PostLoadEventListener
post-update PostUpdateEventListener
post-delete PostDeleteEventListener
post-insert PostInsertEventListener
应用Hibernate事件监听器
用户制定的事件监听器首先需要实现与所需要处理的事件对应的接口,或者继承实现这个接口的类
通过使用Hibernate的配置文件(hibernate.cfg.xml)配置事件监听对象,或者使用Configuration对象注册这个定制的事件监听器对象
LogPostLoadEventListener
Java代码 收藏代码
import org.hibernate.event.PostLoadEvent;
import org.hibernate.event.PostLoadEventListener;
public class LogPostLoadEventListener implements PostLoadEventListener {
private static final long serialVersionUID = 404241098418965422L;
public void onPostLoad(PostLoadEvent event) {
System.out.println("Class:" + event.getEntity().getClass().getName() + ",id:"
+ event.getId());
}
}
修改Hibernate.cfg.xml文件
Xml代码 收藏代码
<mapping resource="com/rbh/examples/Guestbook.hbm.xml" />
<listener type="post-load" class="com.rbh.examples.LogPostLoadEventListener" />
</session-factory>
</hibernate-configuration>
或者通过Configuration 对象注册这个监听器对象
Java代码 收藏代码
Configuration config = new Configuration();
config.setListener("post-load", new LogPostLoadEventListener());
config.configure();
Session session = config.buildSessionFactory().getCurrentSession();
编写、配置好监听器以后,当通过Session对象的load()、get()方法或者Query对象的list方法加载持久化对象之后,LogPostEventListener对象中的onPostLoad()方法就会被执行.
使用监听器实现记录操作日志
利用Hibernate的事件机制,不仅能够精确追踪到持久化对象的字段的修改,持久化对象关联关系的变更,还能记录更新前的数值和更新后的数值
监听器与拦截器的比较
监听器可以实现更细化粒度的拦截
通过监听器获取所拦截的持久化对象的修改后喝修改前的状态值
能直接通过Event对象获取Session对象
org.hibernate.Interceptor接口定义了Hibernate中通用拦截机制
创建Session对象的时候,所有的Session对象或者这个Session对象的所有持久化操作的动作都会被指定的拦截器进行拦截.
Interceptor接口的方法
afterTransactionBegin()
当一个事务时候启动时,会立刻调用这个方法,这个方法可以改变这个事务的状态,例如:回滚事务
instantiate()
创建对象,如果返回null,则Hibernate将调用实体类的默认构造方法创建持久化对象
getEntity()
当一个持久化对象,通过标示符属性在Session对象的缓存中进行查找,并且没有找到时,会调用该方法
getEntityName()
当session对象获取持久化对象的名字时,会调用这个方法
onLoad()
该方法在持久化对象初始化之前加载,这个的持久化对象处于刚被创建的状态(对象的属性值都未赋值)
findDirty()
当调用Session对象的flush()方法时,讲调用该方法判断对象是否为脏数据,这是脏数据检查的另外拦截的实现方式
isTransient()
当调用Session对象的saveOrUpdate方法时,会调用该方法判断对象是否尚未保存
onSave()
在对象被保存之前调用,通过这个方法可以对要保持的对象的属性进行修改
onDelete()
该方法在持久化对象被删除之前调用
preFlush()
该方法当调用Session对象的flush()方法之前被调用
onFlushDirty()
当调用Session对象flush()方法进行脏数据检查时,如果发现持久化对象的状态发生了改变,会调用该方法
postFlush()
该方法调用Session对象的flush()方法之后被调用
beforeTransactionCompletion()
在完成一个事务之前,调用此方法,这个方法可以改变事务的状态,例如回滚事务
afterTransactionCompletion()
当完成一个事务之后,立刻调用此方法
1、使用拦截器实现操作日志
在应用系统中,对所有的数据库的操作都做记录,记录所操作内容,操作的用户和操作的时间
Java代码 收藏代码
import org.hibernate.CallbackException;
import org.hibernate.EmptyInterceptor;
import org.hibernate.type.Type;
import java.io.Serializable;
import java.util.Date;
public class DaoLogInterceptor extends EmptyInterceptor {
private static final long serialVersionUID = 1L;
@Override
public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
super.onDelete(entity, id, state, propertyNames, types);
}
@Override
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
return super.onSave(entity, id, state, propertyNames, types);
}
@Override
public void onCollectionUpdate(Object collection, Serializable key) throws CallbackException {
super.onCollectionUpdate(collection, key);
}
@Override
public void onCollectionRemove(Object collection, Serializable key) throws CallbackException {
super.onCollectionRemove(collection, key);
}
@Override
public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
return super.onLoad(entity, id, state, propertyNames, types);
}
@Override
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
System.out.println("operateTm:"+entity.getClass().getName()+"--OperateTm:"+new Date()+"--操作用户:当前登录用户");
getOperateDetails(previousState, currentState, propertyNames);
return super.onFlushDirty(entity, id, currentState, previousState, propertyNames, types);
}
/**
* 操作前后的数据差异
*
* @param oldState
* @param state
* @param operateLog
* @return
*/
private void getOperateDetails(Object[] oldState, Object[] state, String[] propertyNames) {
for (int i = 0; i < propertyNames.length; i++) {
if (!equalsObject(oldState[i], state[i])) {
System.out.println("Field:"+propertyNames[i]+"NewValue:"+state[i] +"OldValue:"+oldState[i]);
}
}
}
private boolean equalsObject(Object o1, Object o2) {
if (o1 == null && o2 != null) {
return false;
}
if (o2 == null && o1 != null) {
return false;
}
if (o1 == null && o2 == null) {
return true;
}
return o1.equals(o2);
}
}
Xml代码 收藏代码
<!--hibernate配置-->
<bean id="myInterceptor" class="com.sf.sfbuy2.context.filter.DaoLogInterceptor"/>
<bean id="postUpdateListener" class="com.sf.sfbuy2.context.filter.PostUpdateListener"></bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="entityInterceptor">
<ref bean="myInterceptor" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="use_sql_comments">true</prop>
<prop key="javax.persistence.validation.mode">none</prop>
<prop key="hibernate.validator.apply_to_ddl">false</prop>
<prop key="hibernate.validator.autoregister_listeners">false</prop>
</props>
</property>
<property name="packagesToScan">
<list>
<value>com.sf.sfbuy2.db.entity</value>
</list>
</property>
</bean>
2、Hibernate的事件监听机制
Hibernate中的事件监听机制可以对Session对象的动作进行监听,一旦发生了特殊的事件,Hibernate就会执行监听器中的事件处理方法
在某些功能的设计中,我们即可以使用Hibernate的拦截器实现,也可以使用Hibernate的事件监听来实现
Hibernate中事件与对应的监听器接口
事件类型 监听器接口
auto-flush AutoFlushEventListener
merge MergeEventListener
delete DeleteEventListener
persist PersistEventListener
dirty-check DirtyCheckEventListener
evice EvictEventListener
flush FlushEventListener
flush-entity FlushEntityEventListener
load LoadEventListener
load-collection InitializeCollectEventListener
lock LockEventListener
refresh RefreshEventListener
replicate ReplicateEventListener
save-update SaveOrUpdateEventListener
pre-load PreLoadEventListener
pre-update PreUpdateEventListener
pre-delete PreDeleteEventListener
pre-insert PreInsertEventListener
post-load PostLoadEventListener
post-update PostUpdateEventListener
post-delete PostDeleteEventListener
post-insert PostInsertEventListener
应用Hibernate事件监听器
用户制定的事件监听器首先需要实现与所需要处理的事件对应的接口,或者继承实现这个接口的类
通过使用Hibernate的配置文件(hibernate.cfg.xml)配置事件监听对象,或者使用Configuration对象注册这个定制的事件监听器对象
LogPostLoadEventListener
Java代码 收藏代码
import org.hibernate.event.PostLoadEvent;
import org.hibernate.event.PostLoadEventListener;
public class LogPostLoadEventListener implements PostLoadEventListener {
private static final long serialVersionUID = 404241098418965422L;
public void onPostLoad(PostLoadEvent event) {
System.out.println("Class:" + event.getEntity().getClass().getName() + ",id:"
+ event.getId());
}
}
修改Hibernate.cfg.xml文件
Xml代码 收藏代码
<mapping resource="com/rbh/examples/Guestbook.hbm.xml" />
<listener type="post-load" class="com.rbh.examples.LogPostLoadEventListener" />
</session-factory>
</hibernate-configuration>
或者通过Configuration 对象注册这个监听器对象
Java代码 收藏代码
Configuration config = new Configuration();
config.setListener("post-load", new LogPostLoadEventListener());
config.configure();
Session session = config.buildSessionFactory().getCurrentSession();
编写、配置好监听器以后,当通过Session对象的load()、get()方法或者Query对象的list方法加载持久化对象之后,LogPostEventListener对象中的onPostLoad()方法就会被执行.
使用监听器实现记录操作日志
利用Hibernate的事件机制,不仅能够精确追踪到持久化对象的字段的修改,持久化对象关联关系的变更,还能记录更新前的数值和更新后的数值
监听器与拦截器的比较
监听器可以实现更细化粒度的拦截
通过监听器获取所拦截的持久化对象的修改后喝修改前的状态值
能直接通过Event对象获取Session对象
发表评论
-
mybatis的学习
2016-01-06 10:18 557首先,POJO /** * @Title: ... -
Hibernate 的Criteria
2017-01-01 23:34 4641、Criteria Hibernate 设计 ... -
hibernate的延时加载的get和load的区别
2017-01-01 23:34 299在hibernate中我们知道如果要从数据库中得到一个对象,通 ... -
hibernate原理
2015-12-15 15:06 4561.Hibernate是如何连接数据库 主要是 ... -
mybatis的配置config文件
2015-12-06 22:24 1039MyBatis是一个支持普通SQL查询,存储过程和高级映射的优 ... -
mybatis的配置文件
2015-12-06 21:58 688只为成功找方法,不为失败找借口! MyBatis学习总结(三 ... -
mybais分页
2015-12-06 15:02 599Mybatis 的物理分页是应用中的一个难点,特别是配合检索和 ... -
Mybatis-分页
2015-12-02 02:33 708Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录 ... -
hibernatet特点
2015-11-23 00:38 320Hibernate优点 (1) 对象/关系数据库映射(ORM) ...
相关推荐
为了更好地控制持久化行为,Hibernate 提供了一个强大的事件处理机制,其中就包括了拦截器(Interceptor)。拦截器允许开发者在对象状态变化时执行自定义逻辑,比如更新时间戳、记录审计日志等。 #### 定义拦截器 ...
拦截器 interceptor 过滤器 filter web.xml implements filter filterchain arg2.doFilter(req,resp); 监听器 servlet application /session /request 6/8 个 1、拦截器 定义拦截器的包 定义拦截器的...
Struts1 框架是Java Web开发中的一个经典MVC框架,它的核心组件之一就是拦截器(Interceptor)。拦截器在Struts1中扮演着重要角色,它允许开发者在动作执行前后插入自定义的逻辑,比如日志记录、权限验证、事务管理...
例如,可以创建一个名为`LoginInterceptor`的拦截器,然后在`<package>`标签内使用`<interceptors>`和`<interceptor>`来声明和配置它。 2. **拦截器实现**:创建一个实现`Interceptor`接口的类,重写`intercept()`...
1. **定义拦截器**:在Struts2中,我们需要创建一个实现了`com.opensymphony.xwork2.interceptor.Interceptor`接口的类。这个类将包含拦截逻辑,例如检查session中是否存在登录信息。 2. **配置拦截器**:在`struts....
**拦截器(Interceptor)**是Struts2框架的核心特性之一,它允许开发者在Action执行前后插入自定义逻辑。拦截器可以用来实现日志记录、权限检查、事务处理等跨切面的功能。在登录场景中,拦截器通常用于验证用户的...
在Java Web开发中,拦截器(Interceptor)是一种重要的设计模式,尤其在框架如Spring MVC或Struts2中,用于在请求处理之前或之后执行特定逻辑。在这个“拦截器登陆权限验证案例”中,我们将深入探讨如何在Struts2...
在SSH(Struts2、Spring、Hibernate)框架中,权限管理和日志拦截器是两个重要的概念,它们在大型企业级应用开发中起到了关键作用。SSH框架允许开发者通过拦截器(Interceptor)来增强或修改默认的请求处理流程。...
在Java Web开发中,过滤器(Filter)和拦截器(Interceptor)是两种常见的处理请求和响应的机制,它们各自有着不同的特性和应用场景。下面将详细解释这两种技术的区别以及它们在SSH(Spring、Struts和Hibernate)...
在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者插入自定义的逻辑来扩展或增强Action执行的流程。在这个“Struts2拦截器的简单登录应用”中,我们将深入理解如何利用拦截器实现用户登录验证。 ...
在SSH(Struts2、Spring、Hibernate)系统中,拦截器用于增强应用程序的功能,比如权限检查、日志记录、事务管理等。在本场景中,我们关注的是如何利用Struts拦截器来实现一个等待页面,以提升用户体验。 当系统...
在SSH2框架中,拦截器(Interceptor)是非常重要的组件之一,它可以用来增强Action的功能,比如权限检查、日志记录等。为了更好地利用Spring的依赖注入功能,可以通过以下步骤在拦截器中注入Spring管理的对象: 1. ...
Struts2的核心组件包括Action(业务逻辑处理)、Result(展示结果)、Interceptor(拦截器)和配置文件(struts.xml)。开发者可以通过定义Action类来实现业务逻辑,然后通过配置Action和Result来定义请求和响应的...
2. **拦截器(Interceptor)**:Hibernate提供了一个非常强大的扩展点——拦截器,它可以用来拦截实体的各种生命周期事件。通过实现`org.hibernate.event.spi.Interceptor`接口,可以自定义拦截器逻辑,比如修改SQL...
拦截器(Interceptor)是Struts2框架中的关键组件之一,用于在执行Action之前或之后进行一系列的预处理或后处理任务。例如,它可以用于身份验证、日志记录、数据校验等。拦截器的设计遵循AOP(面向切面编程)思想,...
- **拦截器定义**: 拦截器可以是实现了 Interceptor 接口的类,也可以是继承了 AbstractInterceptor 或 MethodFilterInterceptor 抽象类的类。 - **自定义拦截器**: 可以通过实现 Interceptor 接口或继承 ...
在实际应用中,Struts2与Hibernate的集成通常通过拦截器(Interceptor)实现。例如,我们可以创建一个自定义的登录拦截器,该拦截器在Action执行之前检查用户的登录状态。如果用户未登录,拦截器会重定向到登录页面...
Struts 2是Struts 1的升级版,它基于MVC设计模式,提供了强大的动作(Action)和结果(Result)管理,以及强大的拦截器(Interceptor)机制。Struts 2的核心组件包括: 1. **Action类**:处理用户请求的业务逻辑。 ...
其中,intercept方法是拦截器的核心方法,它将被拦截器框架调用,以便在Action执行之前或之后进行拦截。 在本例中,我们将实现一个检查权限的拦截器,名为CheckPrivilegeInterceptor。这个拦截器继承自...
首先,我们需要新建一个 Hibernate 拦截器类,用于拦截所有数据库操作,并替换掉其中的表名。 ```java public class AutoTableNameInterceptor extends EmptyInterceptor { private String srcName = StringUtils....