首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按弹簧处理数据库事件

按弹簧处理数据库事件
EN

Stack Overflow用户
提问于 2014-04-10 15:18:54
回答 1查看 3.1K关注 0票数 2

我想用spring来处理数据库事件。spring有事件处理机制,我在spring中定义了一些自定义事件处理程序。例如,如果员工在系统中被停用,那么需要执行某些特定的活动集,那么是否有任何方式可以触发spring自定义事件列表。我用春天和冬眠。我怀疑hibernate中是否有一种方法可以实现这一点,但是我想要处理它-- spring。提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-11 19:41:18

如果我正确理解了您的问题,您需要知道一种拦截hibernate实体更改事件并触发一个可以由Spring处理的事件的方法。您可以始终拦截hibernate中的事件,即使用Interceptor检查和/或更改hibernate实体元素的属性值。例如,Employee实体具有status(例如String)字段,您可以检测到到此字段的更改(例如,从活动到非活动),并在更改被持久化到数据库之前执行一些操作。对此实体中的任何集合的更改也可以被截获。为了简洁起见,我只做场的改变。

将用于字段更改跟踪的侦听器接口FieldChangeListener定义为:

代码语言:javascript
运行
复制
    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的类:

代码语言:javascript
运行
复制
    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中的拦截器和侦听器定义为:

代码语言:javascript
运行
复制
    <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类是:

代码语言:javascript
运行
复制
    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节标准事件和自定义事件这里

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22992195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档