我的应用程序由 spring @transaction 和 hibernate 组成。我正在尝试使用休眠拦截器。我将拦截器注册为
getHibernateTemplate().getSessionFactory().withOptions().interceptor(interceptor).openSession();
实际的拦截器扩展了 EmptyInterceptor 并且我重写了 onSave() 方法。
问题是拦截器 onSave() 方法被调用,但之后实际的实体没有插入到数据库中。
public boolean onSave(Object entity, Serializable id, Object[] state,
String[] propertyNames, Type[] types) {
System.out.println("inside interceptor - on save");
{
// my changes here . setting a field of the entity.
return true;
}
return false;
}
因此,更改被提交到持久对象和 Hibernate 将向数据库发出的在保存对象之前调用。拦截器可以修改状态,该状态将用于 SQL INSERT 并传播到持久对象。
INSERT
语句。如果您使用与打开事务的会话不同的会话查询数据库,您可能需要确保在
@Transactional
方法完成后正在搜索记录。此时 Spring 会将事务提交到数据库。您也可以尝试使用
Interceptor.afterTransactionCompletion() 来检查记录是否有效插入。
事务提交或回滚后调用。