усекать таблицу из источника данных в нескольких источниках данных jpa не работает - PullRequest
1 голос
/ 05 июня 2019

Я пытаюсь обрезать таблицу с помощью jpa, когда конфигурация с несколькими источниками данных, команда, кажется, зафиксирована, но на самом деле - данные из таблицы все еще сохраняются и не удаляются.

Мои фрагменты кода ниже:

соответствующая конфигурация источника данных

@Configuration
@EnableJpaRepositories(basePackages = "com.haaretz.jobs.newsletter_preferences_job.data.newsletter_alerts")
public class NewsletterAlertsConfig {

    private Environment environment;

    @Autowired
    public NewsletterAlertsConfig(Environment environment){
        this.environment = environment;
    }

    @Primary
    @Bean(name = "newsletterAlertsDataSource")
    public DataSource newsletterAlertsDataSource() {
        return DataSourceBuilder
                .create()
                .driverClassName(environment.getProperty("datasource.newsletterAlerts.driverClassName"))
                .url(environment.getProperty("datasource.newsletterAlerts.jdbcUrl"))
                .username(environment.getProperty("datasource.newsletterAlerts.username"))
                .password(environment.getProperty("datasource.newsletterAlerts.password"))
                .build();
    }

    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("newsletterAlertsDataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.haaretz.jobs.newsletter_preferences_job.data.newsletter_alerts")
                .persistenceUnit("newsletterAlerts")
                .build();
    }
}

настроен второй источник данных

@Configuration
@EnableJpaRepositories(basePackages = "com.haaretz.jobs.newsletter_preferences_job.data.gstat",
        entityManagerFactoryRef = "gstatEntityManagerFactory")
public class GstatConfig {

    private Environment environment;

    @Autowired
    public GstatConfig(Environment environment){
        this.environment = environment;
    }

    @Bean(name = "gstatDataSource")
    public DataSource gstatDataSource() {
        return DataSourceBuilder
                .create()
                .driverClassName(environment.getProperty("datasource.gstat.driverClassName"))
                .url(environment.getProperty("datasource.gstat.jdbcUrl"))
                .username(environment.getProperty("datasource.gstat.username"))
                .password(environment.getProperty("datasource.gstat.password"))
                .build();
    }

    @Bean(name = "gstatEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean gstatEntityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("gstatDataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.haaretz.jobs.newsletter_preferences_job.data.gstat")
                .persistenceUnit("gstat")
                .build();
    }
}

Репозиторий

@Repository
public interface NewsletterAlertsRepository extends CrudRepository<NewsletterOpPersonalNl, String> {


    @Modifying
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Query(
            value = "truncate table OP_PERSONAL_NL",
            nativeQuery = true
    )
    void truncate();

}

задание, которое активирует удаление

@Component
public class NewsletterPreferencesJob {

    private NewsletterAlertsRepository newsletterAlertsRepository;

    @Autowired
    public NewsletterPreferencesJob(NewsletterAlertsRepository newsletterAlertsRepository) {
        this.newsletterAlertsRepository = newsletterAlertsRepository;
    }

    @Transactional
    public void doTask() {
        newsletterAlertsRepository.truncate();
    }

}

Я также пытался использовать функцию по умолчанию crudRepoditory, которая возвращает тот же результат (зафиксированный, но не удаленный):

newsletterAlertsRepository.deleteAll();

или с помощью диспетчера транзакций, который также фактически не удаляет данные

        TransactionTemplate transactionTemplate = new TransactionTemplate(platformTransactionManager);
        transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                entityManager.createNativeQuery("truncate table OP_PERSONAL_NL").executeUpdate();
            }
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...