使用Spring的AnnoationSessionFactoryBean时如何注册Hibernate saveUpdate监听器

时间:2014-06-21 19:36:38

标签: java spring hibernate

我正在尝试为hibernate添加自定义保存事件侦听器。我的目标是让hibernate设置最后一次更新并在某些实体上创建时间戳值。我从其他帖子中读到JPA注释会这样做,但是如果你使用的是Hibernate Session,那么你需要扩展DefaultSaveOrUpdateEventListener。我这样做了,但没有奏效。我看到的每个例子都使用了一个hibernate配置文件。我的sessionFactory配置了Spring。

<bean id="mySessionFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource">
      <ref bean="myDataSource"/>
    </property>     
    <property name="hibernateProperties">
       <props>           
         <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>    
         <prop key="hibernate.show_sql">true</prop>
       </props>
    </property> 
    <property name="packagesToScan">
        <list>
            <value>com.mypackages</value>
        </list>
    </property>
    <property name="eventListeners">
        <map>
            <entry key="save-update">
                <ref local="saveEventListener"  />
            </entry>

        </map>
    </property>     
</bean>
    <bean id="saveEventListener" class="com.mypackage.event.SaveOrUpdateDateListener" />    

我设置了一个断点,它没有通过监听器。我最近更新和创建的字段未在数据库中设置。

1 个答案:

答案 0 :(得分:0)

我已经处理过类似的问题并最终解决了。 我有一个基础pojo,其中包含Auditing属性,每个实体都扩展了这个基础pojo。在保存或更新的调用中,事件监听器的方法被触发,我用审计信息更新实体。

@Component

public class EntitySaveListener implements PersistEventListener, MergeEventListener,    
PreInsertEventListener {

private static final long serialVersionUID = 1L;

static final Logger logger = LoggerFactory
        .getLogger(EntitySaveListener.class);

@Autowired
private LocalEntityManagerFactoryBean entityManagerFactory;

public EntitySaveListener() {
    logger.info("EntitySaveListener created");
}

public void onPersist(PersistEvent event) throws HibernateException {
    if (SecurityContextHolder.getContext() != null
            && SecurityContextHolder.getContext().getAuthentication() != null) {
        Object principal = SecurityContextHolder.getContext()
                .getAuthentication().getPrincipal();
        if (principal != null && principal instanceof V2VUserDetails) {
            User user = ((V2VUserDetails) principal).getUser();
            if (event.getObject() instanceof ModificationTracker &&
            user != null) {
                ModificationTracker entity = (ModificationTracker) event.getObject();
                entity.setCreatedDate(new Date());
                entity.setCreatedBy(user);
                entity.setLastUpdated(new Date());
                entity.setLastUpdatedBy(user);
            }
        }
    }
}

@SuppressWarnings("rawtypes")
@Override
public void onPersist(PersistEvent event, Map arg1)
        throws HibernateException {
    // TODO Auto-generated method stub
}

@Override
public void onMerge(MergeEvent event) throws HibernateException {
    if (SecurityContextHolder.getContext() != null
            && SecurityContextHolder.getContext().getAuthentication() != null) {
        Object principal = SecurityContextHolder.getContext()
                .getAuthentication().getPrincipal();
        if (principal != null && principal instanceof V2VUserDetails) {
            User user = ((V2VUserDetails) principal).getUser();
            if (event.getEntity() instanceof ModificationTracker
                    && user != null) {
                ModificationTracker entity = (ModificationTracker) event
                        .getEntity();
                entity.setLastUpdated(new Date());
                entity.setLastUpdatedBy(user);
            }
        }
    }
}

@SuppressWarnings("rawtypes")
@Override
public void onMerge(MergeEvent arg0, Map arg1) throws HibernateException {
    // TODO Auto-generated method stub
}

@Override
public boolean onPreInsert(PreInsertEvent arg0) {
    // TODO Auto-generated method stub
    return false;
}

}