2012-07-31 2 views
4

저는 스프링 구성된 최대 절전 모드 어플리케이션으로 작업하고 있습니다. 트랜잭션 관리와 entityInterceptor로 정의 된 auditInterceptor가 있습니다. 내가 코드를 디버깅 할 때 나는 그러나의 끝에서, entityInterceptors 방법에 진입하고있어 날짜의 설정되는 것은 그들이 데이터베이스 :(에없는 저장합니다. Hibernate 엔티티 인터셉터가 트리거되지만 설정 값은 저장되지 않습니다.

구성을 다음과 같은 고려

<bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  
     <property name="dataSource" ref="dataSource" /> 
     <property name="hibernateProperties"> 
      <value> 
       hibernate.dialect=${hibernate.dialect} 
       hibernate.show_sql=${hibernate.show_sql} 
       hbm2ddl.auto=${hbm2ddl.auto} 
      </value> 
     </property> 
     <property name="schemaUpdate"> 
      <value>true</value> 
     </property> 
     <property name="annotatedClasses"> 
      <list> 
           .. bunch of annotatedClasses" ... 
      </list> 
     </property> 
    </bean> 

<bean name="auditInterceptor" class="com.mbalogos.mba.dao.AuditInterceptor" /> 

    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
     <property name="entityInterceptor" ref="auditInterceptor"/> 
    </bean> 

    <bean id="namedQueryDao" class="com.mbalogos.mba.dao.NamedQueryDaoImpl"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

및 저장 방법 다음 entityInterceptor

public class AuditInterceptor extends EmptyInterceptor{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -8374988621501998008L; 

    @Override 
    public boolean onSave(Object entity, Serializable id, Object[] state, 
      String[] propertyNames, Type[] types) { 
     if(entity instanceof DomainObject){ 
      Timestamp date = new Timestamp(new Date().getTime()); 
      ((DomainObject)entity).setCreationDate(date); 
      ((DomainObject)entity).setModificationDate(date); 
     }  
     return true; 
    } 

    @Override 
    public boolean onFlushDirty(Object entity, Serializable id, 
      Object[] currentState, Object[] previousState, 
      String[] propertyNames, Type[] types) { 
     if(entity instanceof DomainObject){ 
      DomainObject domainObject = (DomainObject)entity; 
      Timestamp date = new Timestamp(new Date().getTime()); 
      domainObject.setModificationDate(date);    
     } 
     return true; 
    } 

    @Override 
    public void onDelete(Object entity, Serializable id, Object[] state, 
      String[] propertyNames, Type[] types) { 
     super.onDelete(entity, id, state, propertyNames, types); 
    } 

    @SuppressWarnings("rawtypes") 
    @Override 
    public void preFlush(Iterator entities) { 
     super.preFlush(entities); 
    } 

    @SuppressWarnings("rawtypes") 
    @Override 
    public void postFlush(Iterator entities) { 
     super.postFlush(entities); 
    } 
} 

따라 sessionFactory의 클래스에 주입

public <T extends DomainObject> T save(T objectToSave) { 
    Session currentSession = null; 
    try { 
     currentSession = sessionFactory.getCurrentSession(); 
     currentSession.save(objectToSave); 

     return objectToSave; 
    } catch (Exception ex) { 
     logger.error(ex); 
    } 
    return null; 
} 

누구든지이 문제가 발생한 이유를 알 수 있습니다. 오, 나는 또한 session.actor를 sessionFactory에 두는 것을 시도했다. 첫 번째 시도 인 transactionManager는 동일한 동작을 시도했다. (

답변

9

나는 그것을 알아낼 수 있었고, 엔티티 객체가 아닌 propertynames와 상태를 가지고 놀아야했다. 이

@Override 
public boolean onFlushDirty(Object entity, Serializable id, 
     Object[] currentState, Object[] previousState, 
     String[] propertyNames, Type[] types) { 
    return audit(currentState, propertyNames);    
} 

@Override 
public boolean onSave(Object entity, Serializable id, Object[] state, 
     String[] propertyNames, Type[] types) { 
    return audit(state, propertyNames); 
} 

private boolean audit(Object[] currentState, String[] propertyNames) { 
    boolean changed = false; 
    Timestamp timestamp = new Timestamp(new Date().getTime()); 
    for(int i=0;i<propertyNames.length;i++){ 
     if("creationDate".equals(propertyNames[i])){ 
      Object currentDate = currentState[i]; 
      if(currentDate == null){ 
       currentState[i] = timestamp; 
       changed = true; 
      } 
     } 

     if("modificationDate".equals(propertyNames[i])){ 
      currentState[i] = timestamp; 
      changed = true; 
     } 
    } 
    return changed; 
} 
0

감사 케니 :(당신이 재생할 수없는 경우 .. 이상한 생각하는 이유도 같은 문제에 직면하고, 엔티티 객체를 제공합니다. 내 경우, 인터셉터는 일부 엔티티와 위해 노력하고 있습니다 나머지는 작동하지 않습니다.
몇 가지 가능한 최적화는 다음과 같습니다.
* 올바른 검색 그런 다음 루프를 끊으십시오.
*이 설정은 엔티티 객체에 직접 속성을 왜 아직도 내가 궁금합니다에만 DomainObject 다음 if(entity instanceof DomainObject)

으로이 방법을 필터와 감사 방법을 적용 할 경우하는 일부 기관에서 근무하지 않았다. 귀하 또는 누군가 그 이유를 알고 있다면 여기에 게시하십시오.

+0

환영합니다. 기쁜 데 도움이되었습니다. – kenny

관련 문제