代码之家  ›  专栏  ›  技术社区  ›  Mahan

如何在Hibernate中更新TimerTask中的实体

  •  0
  • Mahan  · 技术社区  · 8 年前

    我想在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);
    }
    

    下面是“更新”方法的代码:

    @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 回复  |  直到 8 年前
        1
  •  1
  •   xyz    8 年前

    update() 方法的非事务性 scheduleTimer() .@Transactional不适用于update()-因为它在一个代理内自调用。

    2) 实体仅在方法结束时更新 当提交事务时,在提交事务之前,您无法看到更改。因此,如果你尝试阅读并行用户感知,你不会看到这种变化。

    此外,如果UsersSensity作为持久性进入scheduleTimer方法,那么 entityManager.merge(entity)

    推荐文章