我想用spring来处理数据库事件。spring有事件处理机制,我在spring中定义了一些自定义事件处理程序。例如,如果员工在系统中被停用,那么需要执行某些特定的活动集,那么是否有任何方式可以触发spring自定义事件列表。我用春天和冬眠。我怀疑hibernate中是否有一种方法可以实现这一点,但是我想要处理它-- spring。提前感谢
发布于 2014-04-11 19:41:18
如果我正确理解了您的问题,您需要知道一种拦截hibernate实体更改事件并触发一个可以由Spring处理的事件的方法。您可以始终拦截hibernate中的事件,即使用Interceptor检查和/或更改hibernate实体元素的属性值。例如,Employee实体具有status(例如String)字段,您可以检测到到此字段的更改(例如,从活动到非活动),并在更改被持久化到数据库之前执行一些操作。对此实体中的任何集合的更改也可以被截获。为了简洁起见,我只做场的改变。
将用于字段更改跟踪的侦听器接口FieldChangeListener定义为:
public interface FieldChangeListener<T>{
/**
* Defining generically so that it can be implemented by any entity on which field change needs to be observed.
* @param propertyName - the property name on the entity
* @param entity - the entity object
* @param previousState - the old value
* @param currentState - the new value
* */
void onChange(Object[] previousState, Object[] currentState, String[] propertyName, Type[] types, Object entity);
} 为了使用上述拦截器,我们需要创建一个扩展EmptyInterceptor的类:
public class FieldChangeInterceptor extends EmptyInterceptor {
private Map<Class, FieldChangeListener<?>> listeners;
public void setListeners(Map<Class, FieldChangeListener<?>> listeners) {
this.listeners = listeners;
}
@Override
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
FieldChangeListener<?> listener = listeners.get(entity.getClass());
boolean report = false;
// Only check for changes if an entity-specific listener was registered.
if (listener != null) {
listener.onChange(previousState, currentState, propertyNames, types, entity);
report = true;
}
return report;
}
}将上下文xml中的拦截器和侦听器定义为:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
...
</bean>
<bean id="fieldInterceptor" class="package.FieldChangeInterceptor">
<property name="listeners">
<util:map id="listeners" map-class="java.util.HashMap">
<entry>
<key><value>package.Employee</value></key><ref bean="employeeListener"/>
</entry>
</util:map>
</property>
</bean>
<bean id="employeeListener" class="package.listener.EmployeeListener"/>EmployeeListener类是:
public class EmployeeListener implements FieldChangeListener<Employee>, ApplicationEventPublisherAware{
private ApplicationEventPublisher publisher;
public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
this.publisher = publisher;
}
@Override
public void onChange(Object[] previousState, Object[] currentState, String[] propertyName, Type[] types, Object obj) {
log.info("Enter onChange()...");
Employee employee = (Employee)obj;
boolean isChange = false;
for (int i = 0; i < currentState.length; i++) {
if (currentState[i] == null) {
if (previousState[i] != null){
isChange = true;
}else{
isChange = false;
}
} else if (!currentState[i].equals(previousState[i])) {
isChange = true;
}
if (isChange) {
//check for status property of Employee
if(propertyName[i].equals("status")){
//Do your activity here - maybe you want to publish application event using eventService.
//Define event.
publisher.publishEvent(event);
}
report = false;
}
}
log.info("Exit onChange()...");
}要发布自定义ApplicationEvent,请调用ApplicationEventPublisher上的publishEvent()方法。有关事件发布的详细信息,请参阅5.14.2节标准事件和自定义事件这里。
https://stackoverflow.com/questions/22992195
复制相似问题