[英]How to update Entity in TimerTask in Hibernate
我想在2分鍾后更新實體字段(以下代碼中10秒用於測試)。 該代碼無任何例外地運行,並且顯示了該消息,但該實體並未真正更新。 可能是什么問題? 這是我使用的代碼:
@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);
}
這是“ update”方法的代碼:
@Transactional
public void update(T entity) {
entity.setLastModificationDate(new Date());
entityManager.merge(entity);
logger.debug(entity.toString() + " Updated!");
}
編輯:我固定使用計時器任務內的波紋管代碼
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();
這是我將sessionFactory與autowired一起使用的方式:
@Autowired
SessionFactory session;
在applicationContext中,我將Bean聲明為波紋管:
<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>
1)您在一個事務內工作,方法update()
與方法scheduleTimer()
無關。 @Transactional不適用於update()-因為它在一個代理中進行自調用。
2)提交事務時,僅在方法scheduleTimer()
的末尾更新實體,直到提交事務后您才能看到更改。 因此,如果嘗試讀取並行的userSMSEntity,則看不到此更改。
另外,如果UserSMSEntity作為持久性進入scheduleTimer方法,則此entityManager.merge(entity)
方法調用對此無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.