繁体   English   中英

如何在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!");
}

编辑:我固定使用计时器任务内的波纹管代码

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM