método get()

Se você deseja obter um objeto por seu ID (ou Chave Primária), o Hibernate possui três métodos para isso:

  • carregar()
  • pegar()
  • encontrar()

Eles fazem a mesma coisa, mas há nuances. O formato geral do método get() é:

EntityClass Name = session.get(EntityClass.class, Object primaryKey);

O método get() recebe como segundo parâmetro o ID (Primary Key) do objeto que precisa retornar. Em seguida, ele carrega esse objeto do banco de dados e o retorna. Exemplo:

User user = session.get(User.class, 2);

Se um registro com este ID não for encontrado no banco de dados, o método retornará nulo.

método load()

O segundo método para carregar um objeto é o método load() . O formato geral do método load() é o mesmo:

EntityClass Name = session.load(EntityClass.class, Object primaryKey);

No entanto, seu comportamento é diferente do método get() .

Primeiro, esse método não retorna um objeto real, mas um proxy: um stub virtual.

Em segundo lugar, ao usar o método load() , não há verificação se existe tal entrada no banco de dados. Em vez disso, o Hibernate cria imediatamente um objeto proxy com o ID passado e o retorna.

Em terceiro lugar, todo o trabalho com o banco de dados ocorrerá ao chamar os métodos do objeto proxy. Se você tentar chamar, por exemplo, o método getName() , ocorrerá a primeira chamada ao banco de dados. Exemplo:

User user = session.load(User.class, new Integer(123));
String name = user.getName(); //this is where the first call to the database will occur

O método load() não deve ser usado para verificar a presença de objetos no banco de dados - ele simplesmente não mostrará isso. Além disso, se você passar um ID inválido, como null, para ele, ele simplesmente retornará null.

método find()

O método find() foi passado para a interface Session do padrão JPA. E como você sabe, esse padrão descreve não apenas a assinatura de métodos, mas também regula o comportamento.

Este método funciona exatamente como o método get() . Se o objeto não foi encontrado pela chave passada, o método simplesmente retornará null.

User user = session.find(User.class, -2); //method will return null

método atualizar()

Outro método útil relacionado ao carregamento de um objeto de um banco de dados é o método refresh() .

Lembra do método persist() que atualizava os dados no banco de dados com base no objeto passado? Assim, o método refresh() funciona exatamente ao contrário: ele atualiza um objeto existente com base nos dados do banco de dados.

Esse comportamento é necessário se, por exemplo, ao gravar um objeto no banco de dados, vários procedimentos armazenados são chamados para corrigir os dados gravados.

Nesses casos, pode ser útil reler o objeto do banco de dados se houver a possibilidade de ele ter sido alterado. Exemplo:

User user = new User();
user.setName("Kolyan");
session.persist(user);
session.flush();  //Force called SQL INSERT and call triggers

session.refresh(user);
// here we continue to work with the updated object