L'insertion de données en base ne marche pas
J'utilise Spring Boot et essaye d'insérer 35000 lignes en base Mysql
Voici la classe principale:
Code:
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:
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:
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:
1 2
|
java.lang.IllegalStateException: Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead |