Possíveis opções de status do objeto
Como você deve ter notado, quando um objeto é anexado ao Hibernate, seu estado é chamado de Persistente ou Gerenciado . Como certo? Persistir ou Gerenciado?
É possível e assim, e assim. De acordo com a especificação JPA, um objeto tem um estado Persist, e de acordo com a especificação Hibernate, seu estado é chamado de Managed.
No Hibernate, o trabalho com o banco de dados é realizado através de um objeto do tipo org.hibernate.Session . De acordo com o JPA, a classe deve se chamar javax.persistence.EntityManager. Isso não é realmente um grande problema, já que ambos os tipos são interfaces.
A interface org.hibernate.Session é declarada assim:
interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager, QueryProducer, java.io.Serializable, SharedSessionContract {
}
Portanto, a interface Session possui todos os métodos que estão na interface EntityManager . Mas também tem a sua própria, herdada de versões anteriores do Hibernate, quando ainda não havia especificação JPA.
Toda essa situação é descrita a seguir:
Vamos dar uma olhada em todos os métodos que a interface de sessão possui, bem como nas nuances de seu trabalho.
As nuances do método persist()
Ao salvar um objeto no banco de dados, você precisa se lembrar de duas coisas.
Primeiro, salvar o objeto resultará eventualmente na execução de um dos comandos SQL: INSERT ou UPDATE. Em segundo lugar, essas ações não ocorrerão imediatamente após chamar o método do objetosessão, mas somente após o fechamento da transação.
Vamos considerar uma situação simples, por exemplo, você tem uma classe User :
@Entity
public class User {
@Id
@GeneratedValue
public Integer id;
@Columnt(name=”user_name”)
public String name;
}
Vamos salvar seu objeto no banco de dados usando o método persist() .
User user = new User();
user.setName("Kolyan");
session.persist(user);
A finalidade desse método é salvar um novo objeto no banco de dados. Se ainda não houver tal objeto, ele será adicionado ao banco de dados chamando o método INSERT SQL .
Se o objeto já estiver no banco de dados, nada acontecerá. No entanto, um terceiro caso também é possível - uma tentativa de salvar um objeto com o status Detached no banco de dados. Nesse caso, uma exceção será lançada. Exemplo:
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!
As nuances do método save()
O método save() foi herdado pelo Hibernate atual de suas versões anteriores. Em sua essência, é muito semelhante ao método persist() , ele também adiciona um novo registro à tabela usando o método INSERT. No entanto, tem várias nuances interessantes.
Primeiro, esse método retorna um valor - o novo ID do objeto . Como você já sabe, os objetos geralmente não possuem um ID antes de serem adicionados ao banco de dados e já estão atribuídos pelo banco de dados. Assim, o método save() do objeto de sessão retorna o ID que foi atribuído ao objeto salvo.
Importante! De acordo com a especificação do Hibernate ID, pode ser qualquer objeto serializável, não apenas um número. Pode ser uma string, um número, um enum, qualquer coisa em geral que possa ser colocada inteiramente em uma coluna de uma tabela no banco de dados.
O método save() tem um tipo de resultado Serialized, então seu resultado deve ser convertido para o tipo correto:
User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);
Além disso, o método save() tem um comportamento diferente no caso do estado Detached do objeto. Ele considera tal objeto como novo e simplesmente adiciona outra 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);
As variáveis id e id2 serão diferentes. Dois registros serão adicionados à tabela no banco de dados, um para cada operação save() .
GO TO FULL VERSION