如何在 Hibernate 中更新 TimerTask 中的实体
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!");
}
编辑:
我在 Timer Task
中使用波纹管代码修复了它
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
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)
方法调用对其没有影响
我想在 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!");
}
编辑: 我在 Timer Task
中使用波纹管代码修复了它 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
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)
方法调用对其没有影响