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

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();
Ce code renvoie une erreur au niveau de 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.

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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
au lieu de MySQLDialect.

Ceci permet l'utilisation des transactions.

l'info peut être triviale pour beaucoup mais intéressante à savoir pour moi