Dúvidas sobre o Hibernate

5 respostas
J

Olá pessoal do fórum,

tive estudando Hibernate esses dias, e me surgiu algumas dúvidas. Apostilas sobre o assunto tem aos montes na internet
ensinando a fazer a persistencias de várias formas. Por exemplo:

public  class ClienteDAO {

	private final Session session;
	
	public ClienteDAO() {
		
		this.session = HibernateUtil.getSession();
	}
	
	public void cadastrar(Cliente cliente) {
		
		Transaction tx = session.beginTransaction();
		session.save(cliente);
		tx.commit();
                session.close();
	
       @SuppressWarnings("unchecked")
	public List<Cliente> getListaDeClientes(){
		
		return session.createCriteria(Cliente.class).list();
	}

}

Minha dúvida é, por que eu tenho que colocar session.close() quando é pra salvar,
mas quando é pra retornar a lista não precisa???
....
Outra coisa, qdo eu usa o PreparedStatement, eu podia fazer isso:

PreparedStatement stmt = con.prepareStatement("delete cliente where cpf=?");

E iria remover o cliente com aquele CPF, como fazer isso com o Hibernate??
Nos exemplos que li, o método de atualização ou remorção ficaram assim:

public void remover(Cliente cliente){
        
        Transaction tx = session.beginTransaction();
        session.delete(cliente);
        tx.commit();
        session.close();
    }
    
    public void atualizar(Cliente cliente){
        
        Transaction tx = session.beginTransaction();
        session.update(cliente);
        tx.commit();
        session.close();
    }

Como o Hibernate vai saber qual cliente remover ou atualizar?? :idea:
Não tem como deixar isso mais específico??

Grato desde já

Jonh

5 Respostas

pvrsouza

eu tb estou estudando hibernate agora mas acho que para excluir com o hibernate não é só colocar isso?

public void excluir(Cliente cliente) {  
          
        Transaction tx = session.beginTransaction();  
        session.delete(cliente);
        tx.commit();  
        session.close(); 
}
J

Justamente isso pvrsouza, e minha dúvida é essa,
como é que o Hibernate saber quem deletar???
Eu tenho que criar um objeto com todos os campos iguais aos que tão no banco
pra ele saber quem excluir???

Ou posso eu instaciar um objeto com o mesmo CPF,
por exemplo, e passar esse objeto pro método (pro Hibernate saber quem deve excluir)??

ajinfotec

sobre o hibernate so salvar apos fechar a session e por que enquanto a seção estiver aberta o
objeto e apenas “pesistent”, no hibernate essintem objetos “transient”, “persistent” e “detached”.
Objetos ?transient? são aqueles que ainda não tem uma representação no banco de dados
(ou que foram excluídos), eles ainda não estão sobre o controle do hibernate e podem não
ser mais referenciáveis a qualquer momento, como qualquer
objeto normal em Java. Objetos ?detached? têm uma representação no banco de dados, mas não fazem
mais parte de uma sessão do Hibernate, o que significa que o seu estado pode não estar mais
sincronizado com o banco de dados. Objetos ?persistent? são os objetos que tem uma representação no
banco de dados e que ainda fazem parte de uma transação do Hibernate, quando a session e fechada
esses objetos passam a ser “detached” finalmente esse objeto estar salvo no banco de dados.

pvrsouza

jonhzihnhoOo:
Justamente isso pvrsouza, e minha dúvida é essa,
como é que o Hibernate saber quem deletar???
Eu tenho que criar um objeto com todos os campos iguais aos que tão no banco
pra ele saber quem excluir???

Ou posso eu instaciar um objeto com o mesmo CPF,
por exemplo, e passar esse objeto pro método (pro Hibernate saber quem deve excluir)??

Voce poderia fazer uma método mais ou menos assim:

Esse CLiente vc passa para o métod:

kabarret

Sobre as seesion, sempre que for manipular dados de banco é preciso informar a hibernet que será iniciado uma transação com o banco, por isso é utilizado o begin transaction, e logo apos sempre é fechada a sessão, isso é questão de boa pratica, você abre uma transação faz o que deve fazer e logo em seguida fecha transação.

O fato de uma constula não precisarem iniciar e fechar uma Transaction é pelo fato de não alterar dados no banco. Ou seja você não vai precisar de utilizar um rollback ou um commit.

O prepare statement é exclusivo para comandos JPQL, quando precisa retornar informações mais trabalhadas, por exemplo um select com filtro de datas.
Já para manipularção insert, delete e update é tudo é feito via objeto, como sitado acima de acorod com o estado do objeto, se ele é transient o hibernate sabe qual registro ele representa no modelo de banco de dados, então ao utilizar persit ou delete, o registro sera atualizado corretamente.

Criado 24 de agosto de 2010
Ultima resposta 24 de ago. de 2010
Respostas 5
Participantes 4