5.4. Transacciones#
Ya se mostró como realizar transacciones en el ejemplo que ilustraba el uso básico del ORM siguiendo la especificación JPA:
try(em EntityFactory = emf.createEntityManager()) {
EntityTransaction tr = em.getTransaction();
try {
tr.begin();
Centro centro = new Centro(11004866, "IES Castillo de Luna", Centro.Titularidad.PUBLICA);
em.persist(centro);
tr.commit();
}
catch(Exception e) {
if(tr != null && tr.isActive()) tr.rollback();
throw new RuntimeException("Error al almacenar el centro", err);
}
}
Tuvimos que introducirlas tan temprano porque JPA nos obliga a explicitar la transacción siempre que se realiza alguna operación que implica cambios en la base de datos. Ciertamente la sintaxis es algo farragosa, por lo que más adelante introduciremos algunos métodos que simplificarán su creación.
Hay otros métodos que están asociados al objeto EntityManager:
em.flush()
Es un método que hace persistentes los cambios obrados hasta ese momento, pero que a diferencia de
tx.commit()
no cierra la transacción.em.clear()
Desvincula todos los objetos asociados. Un efecto colateral es que ninguno de los cambios que haya sufrido, se aplicará al hacer un commit (o un flush).
em.detach(Object entity)
Desvincula el objeto proporcionado como argumento.