Para almacenar objetos persistentes se proceso siguiendo los siguientes pasos:
- Se instancia un objeto nuevo (estado transitorio).
- Se obtiene una sesión y se comienza la transacción, inicializando el contexto de persistencia.
- Una vez obtenida da la sesión, se llama al método
save()
, el cual introduce el objeto en el contexto de persistencia. Este método devuelve el identificador del objeto persistido.
- Para que los cambios sean sincronizados en las bases de datos, es necesario realizar el
commit
de la transacción. Dentro del objeto sesión se llama al método flush()
. Es posible llamarlo explícitamente. En este momento, se obtiene la conexión JDBC a la bases de datos para poder ejecutar la oportuna sentencia.
- Finalmente, la sesión se cierra, con el objeto de liberar el contexto de persistencia, y por tanto, devolver la referencia del objeto creado al estado disociado.
Los objetos cargados, grabados, creados o consultados por las sesión pueden ser manipulados por la aplicación, y cualquier cambio a su estado de persistencia será persistido cuando se le aplique "flush" a la sesión.
No hay que invocar ningún método en particular para que las modificaciones se vuelvan persistentes. Así
que la manera más sencilla y directa de actualizar el estado de un objeto es cargarlo con load(), y luego manipularlo directamente, mientras la sesión esté abierta.
Para borrar objetos persistentes, podemos ejecutar Session.delete()
, que quitará el estado de un objeto de la base de datos. Por supuesto, su aplicación podría aún contener una referencia al objeto quitado. Se puede borrar objetos en cualquier orden, no se van producir violaciones de llave externa, pero sí es posible violar constraints
NOT NULL
aplicadas a la columna de llave externa.
Muchas aplicaciones necesitan capturar un objeto en una transacción, mandarlo a la capa de interfaz de usuario para su manipulación, y grabar sus cambios en una nueva transacción. Las aplicaciones que usan este tipo de estrategia en entornos de alta concurrencia, normalmente usan datos versionados para garantizar aislamiento durante la "larga" unidad de trabajo.
Hibernate soporta este modelo, proveyendo "reasociación" de entidades desprendidas usando los métodos
Session.update()
o Session.merge(
).