J'utilise Spring Boot et essaye d'insérer 35000 lignes en base Mysql


Voici la classe principale:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
    @SpringBootApplication
    @EnableTransactionManagement
    public class DemoImmobilierBackApplication implements WebMvcConfigurer {
 
    	public static void main(String[] args) {
    		SpringApplication.run(DemoImmobilierBackApplication.class, args);
    	}
Voici le service. J'appelle cette méthode en faisant une requête via postman (cette requête a un autre but, mais j'en profite pour insérer mes lignes)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
    @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);
        }
    }
Voici le repository
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
    @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();
 
        	    }
        	} 
    	}
    }
Mais aucune ligne est insérée en base.

J'ai vérifié que la méthode persistCodePostalNomCommune est bien appellée. Tout dans les logs et le temps mis par la requête indique que l'opération persist pour les 39000 ligne se déroule bien, mais quand j'inspecte la base, elle est vide.

J'ai essayé aussi de d'executer au début de la méthode em.getTransaction().begin(); et à la fin em.getTransaction().commit() soit en laissant, soit en enlevant l'annotation @Transaction , mais cela me donne l'erreur suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
java.lang.IllegalStateException: Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead