Remove no Hibernate com chave composta

6 respostas
D

Pessoal,

Bom dia.
Estou desenvolvendo uma aplicação em Flex 3 + Java.
Tenho uma tabela chamado acesso cuja chave primária é composta de usuarioid+funcaoid.
A questão é que com tabelas de chaves primárias simples, para apagar um registro eu uso:

item=em.find(Classe,class, chave).
em.remove(item)

Como faço isso quando a chave é composta?
Obrigado,

6 Respostas

P

funciona da mesma forma.

D

Entendo, mas como eu faço para passar dois campos como parâmetro para em.find ?
Desde ja agradeço…

P

você deve passar um objeto que seja a chave primária composta.

Segue um exemplo de pk composta:

@Embeddable
public class EmployeePK implements Serializable {

	private String name;
	private long id;

	public EmployeePK() {}

	public String getName(){
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public int hashCode() {
		return (int) name.hashCode() + id;
	}

	public boolean equals(Object obj) {
		if (obj == this) return true;
		if (!(obj instanceof EmployeePK)) return false;
		if (obj == null) return false;
		EmployeePK pk = (EmployeePK) obj;
		return pk.id == id && pk.name.equals(name);
	}
}

algo que pode ser útil, em http://java.boot.by/scbcd5-guide/ch05s03.html

D

Desculpe-me, mas acho uqe não me expliquei corretamente.
Quanto a implementação da entidade , fiz corretamente.

Agora quero utilizar o find para retornar o item que quero apagar em em.remove(classe).
É isto que não estou entendendo.

Muito obrigado,

R

Como o pozzo disse, vc deve passar o objeto que é sua chave composta, e não a entidade em si.

Se você postar seus código, poderemos te ajudar mais.

[]´s

D

Rodrigo e Pozzo,

Muito obrigado pela ajuda de vocês.
Consegui resolver da seguinte forma :

O item que estou apagando está na entidade Acesso cuja chave primária é composta por usuario_id e funcao_id.

String usuario_id = request.getParameter("usuario_id");
            String funcao_id = request.getParameter("funcao_id");        
            int usuarioid = Integer.parseInt(usuario_id.trim());
            int funcaoid = Integer.parseInt(funcao_id.trim());       
            perfilUsuarioPK = new AcessoPK();
            perfilUsuarioPK.setFuncaoId(funcaoid);
            perfilUsuarioPK.setUsuarioid(usuarioid);
            perfilUsuarioDao = em.find(Acesso.class, perfilUsuarioPK);
            em.remove(perfilUsuarioDao);            
           try {
                em.getTransaction().begin();
                em.getTransaction().commit();
            } catch (Exception e) {
                System.err.println("Erro :" + e.getMessage());
            }

Mais uma vez, obrigado pela força.

Criado 20 de agosto de 2008
Ultima resposta 20 de ago. de 2008
Respostas 6
Participantes 3