10 Stimmen

Spring3 's @Transactional @Scheduled nicht an DB übergeben?

Dies ist mein 1. Mal versuchen Spring3's @Scheduled , aber fand ich kann nicht an DB zu begehen. Dies ist mein Code:

@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);
  }
}

Ich denke, es sollte funktionieren, ich kann sehen, dass es stündlich startet und xxx aus der DB lädt, aber die Daten werden nicht in die DB übertragen.

Es gab schon tx:annotation-driven in der xml des Frühlings:

<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" />

Kann mir jemand sagen, was ich hier verpasst habe?

Ich habe eine ' schmutzig ' Lösung:

@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);
      }
    });
  }
}

Es funktioniert einwandfrei hier, aber es ist so redundant, dass der Code schwerer zu lesen ist. Ich frage mich, warum TransactionManager wird nicht injiziert (und geöffnet) in den vorherigen Codeschnipseln?

Herzlichen Dank!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X