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

标签 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" />    

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

最佳答案

我遇到过类似的问题,终于解决了。 我有一个带有审计属性的基本 pojo,每个实体都扩展了这个基本 pojo。在调用保存或更新时,事件监听器的方法在我用审计信息更新实体时被触发。

@组件

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;
}

关于java - 使用 Spring 的 AnnoationSessionFactoryBean 时如何注册 Hibernate saveUpdate 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24345189/

相关文章:

java - 多线程矩阵乘法

java - Tomcat 身份验证和 Spring Security

java - Spring批量集成

java - 初始 Spring Boot 启动项目设置 - 面临的问题

java - jdbc查询对hibernate二级缓存有什么影响?我可以触发特定缓存区域的缓存刷新吗

java - 如何在Gwt的PopupPanel中添加取消按钮

java - Hibernate Session 未使用 AOP 切点事务管理器绑定(bind)到线程

Java - 应该是基本的东西是每行都给出错误

java - 在 Hibernate 中映射一个有 2 个列表的对象会导致问题

java - 在 Hibernate 中映射多行每项对象