Posibles opciones de estado del objeto
Como habrá notado, cuando un objeto se adjunta a Hibernate, su estado se llama Persistente o Administrado . ¿Cuánta razón? ¿Persistir o Gestionar?
Es posible y así, y así. De acuerdo con la especificación JPA, un objeto tiene un estado persistente y, de acuerdo con la especificación de Hibernate, su estado se denomina Administrado.
En Hibernate, el trabajo con la base de datos se realiza a través de un objeto de tipo org.hibernate.Session . Según JPA, la clase debería llamarse javax.persistence.EntityManager. Esto no es realmente un gran problema, ya que ambos tipos son interfaces.
La interfaz org.hibernate.Session se declara así:
interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager, QueryProducer, java.io.Serializable, SharedSessionContract {
}
Por lo tanto, la interfaz Session tiene todos los métodos que están en la interfaz EntityManager . Pero también tiene la suya, que heredó de versiones anteriores de Hibernate, cuando aún no existía la especificación JPA.
Toda esta situación se describe de la siguiente manera:
![](https://cdn.codegym.cc/images/article/c4cc3931-5115-471e-aec1-812c863f7c4a/1024.jpeg)
Echemos un vistazo a todos los métodos que tiene la interfaz de sesión, así como los matices de su trabajo.
Los matices del método persist()
Al guardar un objeto en la base de datos, debe recordar dos cosas.
Primero, guardar el objeto eventualmente resultará en la ejecución de uno de los comandos SQL: INSERTAR o ACTUALIZAR. En segundo lugar, estas acciones no ocurrirán inmediatamente después de llamar al método del objeto.sesión, pero solo después de cerrar la transacción.
Consideremos una situación simple, por ejemplo, tiene una clase de usuario :
@Entity
public class User {
@Id
@GeneratedValue
public Integer id;
@Columnt(name=”user_name”)
public String name;
}
Guardemos su objeto en la base de datos usando el método persist() .
User user = new User();
user.setName("Kolyan");
session.persist(user);
El propósito de este método es guardar un nuevo objeto en la base de datos. Si aún no existe tal objeto, se agregará a la base de datos llamando al método INSERT SQL .
Si el objeto ya está en la base de datos, no pasará nada. Sin embargo, también es posible un tercer caso: un intento de guardar un objeto con el estado Separado en la base de datos. En este caso, se lanzará una excepción. Ejemplo:
User user = new User();
user.setName("Kolyan");
session.persist(user);
session.evict(user); // detach the object from the session
session.persist(user); // a PersistenceException will be thrown here!
Los matices del método save()
El método save() fue heredado por el Hibernate actual de sus versiones anteriores. En esencia, es muy similar al método persist() , también agrega un nuevo registro a la tabla usando el método INSERT. Sin embargo, tiene varios matices interesantes.
Primero, este método devuelve un valor: la nueva ID del objeto . Como ya sabe, los objetos generalmente no tienen una identificación antes de agregarse a la base de datos y ya está asignada por la base de datos. Entonces, el método save() del objeto de sesión devuelve la ID que se asignó al objeto guardado.
¡Importante! Según la especificación de ID de Hibernate, puede ser cualquier objeto serializable, no solo un número. Puede ser una cadena, un número, una enumeración, cualquier cosa en general que pueda colocarse por completo en una columna de una tabla en la base de datos.
El método save() tiene un tipo de resultado serializado, por lo que su resultado debe convertirse en el tipo correcto:
User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);
Además, el método save() tiene un comportamiento diferente en el caso del estado Separado del objeto. Considera tal objeto como nuevo y simplemente agrega otra entrada:
User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);
session.evict(user); // detach the object from the session
Integer id2 = (Integer) session.save(user);
Las variables id e id2 serán diferentes. Se agregarán dos registros a la tabla en la base de datos, uno para cada operación save() .