Bonjour,
J'avais un problème dans un contexte non managé avec hibernate et MySQL :
j ai une simple entité société acceptant d'autres societes comme filiales
Ce code renvoie une erreur au niveau de
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 EntityManagerFactory _emf = Persistence.createEntityManagerFactory("testDS"); EntityManager _em = _emf.createEntityManager(); _em.setFlushMode(FlushModeType.COMMIT); _em.getTransaction().begin(); try { Societe _soc = new Societe(); _soc.setNom("Soc1"); _soc.setAdresse("nimporte"); _em.persist(_soc); Societe filiale1 = new Societe(); filiale1.setNom("F1"); filiale1.setAdresse("adr1"); filiale1.setMaisonMere(_soc); _em.persist(filiale1); for (Societe _s:_soc.getFiliales()){ System.out.println("la societe "+_s.getNom()+" est une filiale de "+_soc.getNom()); } _em.getTransaction().commit(); }catch (Exception e){ System.out.println("[ERROR] erreur dans le traitement rollback de la transaction"); if (_em.getTransaction()!=null && _em.getTransaction().isActive()) _em.getTransaction().rollback(); } _em.close(); _emf.close();puisque je ne fais pas de refresh sur mon entité. Or les données étaient tout de même sauvegardées malgré le rollback appelé dans mon catch.
Code : Sélectionner tout - Visualiser dans une fenêtre à part _soc.getFiliales()
Après recherche il s'avère que j'utilisais sous MySQL l'engine MyISAM qui fonctionne en autocommit.
Pour permettre la création de table utilisant InnoDB comme moteur, il faut spécifier dans le persistence.xml :
au lieu de MySQLDialect.
Code : Sélectionner tout - Visualiser dans une fenêtre à part <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
Ceci permet l'utilisation des transactions.
l'info peut être triviale pour beaucoup mais intéressante à savoir pour moi
Partager