2017-07-20 1 views
0

Je veux mettre à jour un champ Entity après 2min (10sec dans le code ci-dessous pour le test). Le code s'exécute sans aucune exception et le message y est imprimé mais l'entité n'est pas vraiment mise à jour. Quel peut être le problème? Voici le code je:Comment mettre à jour l'entité dans TimerTask dans Hibernate

@Transactional 
public void scheduleTimer(UserSMSEntity userSMSEntity) { 
    Timer timer = new Timer(); 
    TimerTask timerTask = new TimerTask() { 
     @Override 
     @Transactional 
     public void run() { 
      userSMSEntity.lastSMSCode = -1; 
      update(userSMSEntity); 
      System.out.println("TIMER TASK"); 
     } 
    }; 
    timer.schedule(timerTask, 10000); 
} 

et voici le code pour la méthode "mise à jour":

@Transactional 
public void update(T entity) { 
    entity.setLastModificationDate(new Date()); 
    entityManager.merge(entity); 
    logger.debug(entity.toString() + " Updated!"); 
} 

EDIT: Je l'ai fixé en utilisant le code ci-dessous dans la

minuterie Tâche
Session session = sessionFactory.openSession(); 
      session.beginTransaction(); 
      UserSMSEntity userSMSEntity = getEntityByUserId(userId); 
      UserSMSEntity userSMSEntity1 = entityManager.find(UserSMSEntity.class, userSMSEntity.getId()); 
      userSMSEntity1.lastSMSCode = -1; 
      session.update(userSMSEntity1); 
      session.getTransaction().commit(); 
      session.close(); 

Voici comment j'ai utilisé sessionFactory avec autowired:

@Autowired 
SessionFactory session; 

et applicationContext Je Déclarée Bean comme ci-dessous:

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="moduleDataSource" /> 
    <property name="hibernateProperties"> 
     <props> 

      <prop key="hibernate.hbm2ddl.auto">update</prop> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
     </props> 
    </property> 


    <property name="packagesToScan" 
       value="you package"/> 
</bean> 
+0

utilisez-vous spirng? – xyz

+0

@xyz Oui, j'utilise le printemps et "mise à jour" fonctionne bien partout, mais pas dans le timertask – Mahan

Répondre

1

1) vous travaillez à l'intérieur d'une transaction, méthode update() pas transactionnel pour la méthode scheduleTimer(). @Transactional n'est pas appliqué pour update() - car il se nomme selfinvocation dans un proxy.

2) l'entité est mise à jour uniquement à la fin de la méthode scheduleTimer() lorsque la transaction est validée et que vous ne pouvez pas voir les modifications tant que la transaction n'est pas validée. Donc, si vous essayez lire userSMSEntity parallèle, vous ne voyez pas ces changements.

Aussi, si UserSMSEntity est entrée en méthode scheduleTimer comme persistante, alors cet appel de méthode entityManager.merge(entity) n'a pas d'effet sur elle

+0

Je l'ai résolu en utilisant sessionFactory Voir ma question éditée, et merci de rappeler ce fait – Mahan