Kro*_*ros 5 spring hibernate interceptor
我有一个简单的HibernateInterceptor,基本上我想自动设置几个字段.这个拦截器(如下所示)扩展了EmptyInterceptor:
public class EntityAuditInterceptor extends EmptyInterceptor {
/**
* The Serial Version UUID.
*/
private static final long serialVersionUID = 4636626262147801287L;
/* (non-Javadoc)
* @see org.hibernate.EmptyInterceptor#onFlushDirty(java.lang.Object, java.io.Serializable, java.lang.Object[], java.lang.Object[], java.lang.String[], org.hibernate.type.Type[])
*/
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
// doing stuff here
return false;
}
/* (non-Javadoc)
* @see org.hibernate.EmptyInterceptor#onSave(java.lang.Object, java.io.Serializable, java.lang.Object[], java.lang.String[], org.hibernate.type.Type[])
*/
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
// doing stuff here
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我使用弹簧配置文件进行布线,如下所示:
<!-- Hibernate SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="hsqlDbDataSource"/>
<property name="packagesToScan">
<list>
<value>com.dreamteam.lms.**.*</value>
</list>
</property>
<!-- Adding Interceptor here -->
<property name="entityInterceptor">
<bean class="com.dreamteam.lms.interceptors.EntityAuditInterceptor"></bean>
</property>
<property name="hibernateProperties">
<props>
<!--<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>-->
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.SingletonEhCacheProvider</prop>
</props>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
然而,拦截器永远不会到达.有没有人有任何线索?我还尝试将以下内容添加到事务管理器bean定义中,如下所示:
<property name="entityInterceptor">
<ref local="entityAuditInterceptor"/>
</property>
Run Code Online (Sandbox Code Playgroud)
Kro*_*ros 14
好的,只是为了记录,我解决了这个问题,结果证明这是我的一个愚蠢的错误.
当我实现扩展EmptyInterceptor的拦截器时,我添加了方法'onFlushDirty',依此类推.到现在为止还挺好.问题是,在使用我的IDE自动导入已使用的类时,我最终错误地导入了java.reflect.Type而不是org.hibernate.type.Type.因此,我并没有真正重写拦截器方法!
我注意到当我将@Override拦截器添加到我的方法时.
另一个谜团解决了...... :)
看来您的 Spring XML 配置是正确的,因此 Hibernate 应该调用您的拦截器方法。然而,这些方法似乎总是返回,false
这意味着 Hibernate 将忽略您所做的任何更改。
当您更改值时,您必须返回true
。例如,此代码迭代所有属性,并true
当且仅当发生更改时返回:
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
boolean changed = false;
for (int i = 0; i < propertyNames.length; i++) {
if ("saveDate".equals(propertyNames[i])) {
currentState[i] = new Date();
changed = true;
}
}
return changed;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7384 次 |
最近记录: |