EntityManager entidades y estados (JPA II)

Una de las cosas mas importantes a entender en JPA son los distintos estados de las entidades que manejamos. JPA soporta 4 estados (new ,managed,detached,removed) .

New : Es el estado en el que se encuentra un objeto una vez construido . No esta asociado a ningún PersistenceContext. Se trata de un objeto normal.

Managed: Es el estado en el que se encuentra una entidad que esta asociada a un PersistenceContext  y almacenada en base de datos via EntityManager. Es el caso de invocar por ejemplo el método persist() de un EntityManager sobre un objeto nuevo.

Detached: Es el estado en el cual se encuentra una entidad que ha estado asociada al PersistenceContext  y deja de estarlo.

Removed: Es el estado en el cual se encuentra una entidad que esta todavia controlada por el PersistenceContext pero va a ser eliminada de la base de datos.

EntityManager y PersistenceContext

Vamos a ver a continuación los métodos mas importantes a nivel de EntityManager para cambiar una entidad de estado  .

persist(). Se encarga de cambiar el estado de un objeto que esta en  el estado new al estado managed y asociarlo al PersistenceContext.

remove(): Se encarga de pasar el estado de de un objeto de managed a removed eliminandolo de la base de datos.

detach() :Se encarga de convertir un objeto managed en un objeto detach. Mantiene su identidad de persistencia pero no esta ya asociado al PersistenceContext.

merge() : Se encarga de convertir un objeto nuevo o detached en un nuevo objeto managed .La diferencia fundamental con persist() es que este asume que el objeto no existe en la base de datos previamente . Algo que si puede ocurrir con el metodo marge