27 Temmuz 2020 Pazartesi

SpringData TransactionTemplate Sınıfı - @Transaction Anotasyonuna Gerek Kalmaz

Giriş
Şu satırı dahil ederiz.
import org.springframework.transaction.support.TransactionTemplate;
constructor
Normalde bu koda gerek yok. TransactionTemplate sınıfını @Autowire etmek yeterli.

Örnek
Şöyle yaparız.
@Primary
@Bean
public PlatformTransactionManager transactionManager() {
  JpaTransactionManager pt = new JpaTransactionManager();
  pt.setEntityManagerFactory(entityManagerFactory().getObject());
  pt.setPersistenceUnitName("sico");
  return pt;
}

@Bean
public TransactionTemplate transactionTemplate() {
  return new TransactionTemplate(transactionManager());
}
execute metodu
Şöyle yaparız
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
  @Override
  protected void doInTransactionWithoutResult(TransactionStatus status) {
    em.createNativeQuery("TRUNCATE TABLE MyTable").executeUpdate();
  }
});
executeWithoutResult metodu
Kod şöyle
default void executeWithoutResult(Consumer<TransactionStatus> action)
throws TransactionException {
  this.execute((status) -> {
    action.accept(status);
    return null;
  });
}
Örnek
Repository.save() çağrısı yapabiliriz. Şöyle yaparız
List<Book> books = ...
transactionTemplate.executeWithoutResult(consumer -> repository.saveAll(books));
setPropagationBehavior metodu
Şöyle yaparız.
TransactionTemplate transaction = new TransactionTemplate(transactionManager);
transaction.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
for (Order order : orders) {
    transaction.execute(new TransactionCallbackWithoutResult() {
        protected void doInTransactionWithoutResult(TransactionStatus status) {
            service.saveOrUpdateOrder(order);
        }
    });
}

Hiç yorum yok:

Yorum Gönder