Йоси Лев

рвые пробую @Scheduled в Spring3, но обнаружил, что не могу зафиксировать в БД. Это мой код:

@Service
public class ServiceImpl implements Service , Serializable
{
  @Inject 
  private Dao dao;

  @Override
  @Scheduled(cron="0 0 * * * ?") 
  @Transactional(rollbackFor=Exception.class)
  public void hourly()
  {
    // get xxx from dao , modify it
    dao.update(xxx);
  }
}

Я думаю, что это должно работать, я вижу, как он запускается ежечасно и загружает ххх из БД, но данные не передаются в БД.

Там былоtx:annotation-driven в весенний XML:

<bean id="entityManagerFactoryApp" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <property name="persistenceUnitName" value="myapp"/>
</bean>
<bean id="transactionManagerApp" class="org.springframework.orm.jpa.JpaTransactionManager">
  <property name="entityManagerFactory" ref="entityManagerFactoryApp" />
</bean>

<tx:annotation-driven transaction-manager="transactionManagerApp" />

Может кто-нибудь сказать мне, что я здесь пропустил?

У меня есть такой 'грязный' решение :

@Service
public class ServiceImpl implements Service , Serializable
{
  @Inject 
  private Dao dao;

  @Inject
  @Qualifier("transactionManagerApp")
  private PlatformTransactionManager txMgrApp;

  @Override
  @Scheduled(cron="0 0 * * * ?")
  @Transactional(rollbackFor=Exception.class)
  public void hourly()
  {
    final TransactionTemplate txTemplateApp = new TransactionTemplate(txMgrApp);
    txTemplateApp.execute(new TransactionCallbackWithoutResult()
    {
      @Override
      protected void doInTransactionWithoutResult(TransactionStatus status)
      {
        //get xxx from dao
        dao.update(xxx);
      }
    });
  }
}

Этоработает отлично здесь, но это так избыточно, что затрудняет чтение кода. интересно, почемуTransactionManager не вводится (и открыл) в предыдущих фрагментах кода?

Большое спасибо !

Ответы на вопрос(3)

Ваш ответ на вопрос