Omet navegació

8.1 - Transaccions

El primer que hauríem de fer notar és que si el SGBD admet transaccions, les possibles modificacions que fem sobre una Base de Dades a través d'Hibernate no es guardaran si no posem en marxa una transacció. Per tant, si volem fer actualitzacions (insercions, esborrats i/o modificacions), el primer que haurem de fer en la sessió serà començar una transacció. Al final podrem confirmar amb commit o rebutjar totes les actualitzacions amb rollback. En el següent codi inserim una nova comarca. Utilitzem el mètode save de la sessió, però ja el veurem més avant. Ara només volem il·lustrar una transacció. No farem aquest exemple, ja que tots ens estem connectant com el mateix usuari a la mateixa Base de Dades, aleshores només el primer ho podria fer, i a la reste ens donaria error perquè ja existiria la fila corresponent a aquesta nova comarca (restricció de clau principal)

	val sessio = Configuration().configure().buildSessionFactory().openSession()
	val t = sessio.beginTransaction()

	val com = Comarca()
	com.nomC = "Columbretes"
	com.provincia = "Castelló"
	sessio.save(com)

	t.commit()
	sessio.close()

En cas de no haver posat les dues sentències de les línies 2 i 9, no hauria hagut cap modificació. El mètode beginTransaction() ha fet començar la transacció, i el mètode commit() l'ha confirmada definitivament. Si en aquest moment vulguérem començar una altra transacció seria suficient amb t.begin().

 

Per a no haver d'estar sempre pendents de transaccions, es podria posar en mode autocommit, és a dir, que automàticament faça un commit després de cada actualització (després de cada save()delete()update() ). Seria canviar en el fitxer hibernate.cfg.xml, posant la següent propietat entre les del <session-factory>:

 
<property name="hibernate.connection.autocommit">true</property>
 

Tanmateix no és tan fiable, i us recomane que utilitzeu transaccions, és a dir, tenir el autocommit a false com estava per defecte i gestionar les transaccions manualment.