приложение springboot: объекты не создаются в базе данных

#spring-boot #jpa

#весенняя загрузка #jpa

Вопрос:

Я использую приложение springboot и пытаюсь вставить 35000 записей в базу данных

Вот основной класс

 @SpringBootApplication
@EnableTransactionManagement
public class DemoImmobilierBackApplication implements WebMvcConfigurer {

    public static void main(String[] args) {
        SpringApplication.run(DemoImmobilierBackApplication.class, args);
    }
  

Вот сервис

 @Service
public class ReferenceServiceImpl implements ReferenceService {
    
    Logger logger = LoggerFactory.getLogger(ReferenceServiceImpl.class);
    
    @Autowired
    private ReferenceRepository referenceRepository;
    
    
    @Transactional
    public void loadDataBaseCodePostalNomCommune(Map<String,String> tokens) {
        List<CodePostalNomCommune> list = new ArrayList<CodePostalNomCommune>();
        Iterator it = tokens.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry pair = (Map.Entry)it.next();
            list.add(new CodePostalNomCommune((String)pair.getKey(), (String)pair.getValue()));
        }
        referenceRepository.persistCodePostalNomCommune(list);
    }
}
  

вот репозиторий

 @Repository
public interface ReferenceRepository {
    
    void persistCodePostalNomCommune(List<CodePostalNomCommune> list);

}
and 

public class ReferenceRepositoryImpl implements ReferenceRepository {
    
    Logger logger = LoggerFactory.getLogger(ReferenceRepositoryImpl.class);

    @PersistenceContext
    private EntityManager em;

    
    @Override
    @Transactional
    public void persistCodePostalNomCommune(List<CodePostalNomCommune> list) {

        logger.info("List<CodePostalNomCommune> SIZE=" list.size());
        int i = 0;
        for (CodePostalNomCommune codePostalNomCommune : list) {
            em.persist(codePostalNomCommune);
            i  ;
            if (i%20 == 0 ) {
                em.flush();
                em.clear();

            }
        } 
    }
}
  

Но в базе данных mysql данные не создаются

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit.

Комментарии:

1. Есть несколько вопросов, … кто запускает этот метод, были ли записи в списке, был persistCodePostalNomCommune ли запущен? Можете ли вы это проверить.

2. Привет, pL4GGu33, я запускаю этот метод, запрашивая список строк. Я просто воспользовался возможностью этого запроса, чтобы вызвать этот метод. Я проверил, что этот метод вызывается. Все в журнале и затраченное время указывают на то, что выполняется операция сохранения для 39000 строк, но когда я проверяю таблицу базы данных, она пуста

3. Не могли бы вы попробовать открыть и закрыть транзакцию вручную. Как em.getTransaction().begin(); и в конце em.getTransaction().commit();

4. Привет, pL4GGu33, я попробовал то, что вы предложили (em.getTransaction().begin(); и в конце em.getTransaction().commit();) в двух следующих случаях: удаление и не удаление аннотации @Transaction, но это выдает мне ошибку java.lang. Исключение IllegalStateException: не разрешено создавать транзакции в общем EntityManager — вместо этого используйте Spring transactions или EJB CMT

5. ладно, неважно …. я попробовал простой пример с вашей конфигурацией (вкл. @Transactional) и это работает из коробки. Теперь я немного беспомощен, почему я не работаю в нашем случае. У вас есть какие-то специальные конфигурации где-нибудь?

Ответ №1:

Я нашел решение. Источник данных был неправильно настроен. В классе метода main я добавил следующее

 @Bean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();


dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUsername("root");
dataSource.setPassword("password");
dataSource.setUrl(
  "jdbc:mysql://localhost:3306/testdb?createDatabaseIfNotExist=trueamp;useUnicode=trueamp;useJDBCCompliantTimezoneShift=trueamp;useLegacyDatetimeCode=falseamp;serverTimezone=UTC"); 

return dataSource;
  

}