2017-07-20 8 views
0

エンティティフィールドを2分後(テストのために以下のコードで10秒)に更新したいとします。コードは例外なく実行され、メッセージは印刷されますが、エンティティは実際には更新されません。何が問題なのでしょうか? は、ここで私が使用したコードです:HibernateでTimerTaskのエンティティを更新する方法

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

EDIT: 私はタイマータスク

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(); 
内部怒鳴るコードを使用して、それを修正

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

、ここでは、 "更新" メソッドのコードです

ここで私はautowiredでsessionFactoryを使用しました:

@Autowired 
SessionFactory session; 

とのApplicationContextに私が怒鳴ると豆を宣言:

<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

上の効果を持っていないあなたはspirngを使うのですか? – xyz

+0

@xyz yea私は春を使用し、 "更新"はどこでもうまくいきますが、timertaskにはありません – Mahan

答えて

1

1)あなたは、メソッドupdate()が法scheduleTimer()のトランザクションではない、1つのトランザクション内で動作します。 @Transactionalはupdate()には適用されません - それは1つのプロキシの内部で自己導入されるためです。

2)エンティティは、トランザクションscheduleTimer()の終了時にのみ更新され、トランザクションがコミットされ、トランザクションがコミットされるまで変更内容が表示されません。だから、あなたがこの変更を見ることはありません、あなたはパラレルuserSMSEntityを読んでみてください。

はまたUserSMSEntityが永続としてscheduleTimer方法に来ている場合、このentityManager.merge(entity)メソッド呼び出しはそれ

+0

私はsessionFactoryを使用して修正しました。私の編集した質問を見てください。 – Mahan

関連する問題