Chave composta no Hibernate

8 respostas
pauloperes

Olá a todos,

Tenho uma classe onde preciso que ela seja identificada através de 3 campos:

@Entity
public class Port

@ManyToOne
private Shelf shelf;

private int slot;

private int port;

Como eu faço para criar uma chave composta com o hibernate-annotations para esta situação?

Att

8 Respostas

pauloperes

so para acrescentar, estou usando o saveOrUpdate do Hibernate, porque nao quero que minhas portas sejam duplicadas. Pensei em fazer um select antes de persistir e entao nao usar chave composta, o que vocês acham?

G

Dê uma procurada no google por hibernate composite key, há muito material sobre isso.

Ou documentação oficial do Hibernate: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-compositeid

No seu caso os três campos são PK? Eu faria assim:

@Entity
public class Port {
    @EmbeddedId
    private PortPK id;

    [...]

}
@Embeddable
public class PortPK implements Serializable {
    @ManyToOne  
    private Shelf shelf;  
   
    private int slot;  
   
    private int port;
}
pauloperes

Kra,

eu nao posso tirar os campos slot e port da minha classe

fnandos

Pode tentar isso:

na sua classe crie um atibuto

@Entity
public class Port{

@EmbeddedId
	private PortPK pk;
}

na classe PortPK crie os atirbutos normalmente

@Entity  
 public class PortPK { 
   
  @ManyToOne  
   private Shelf shelf;  
    
   @Column(name="slot")
   private int slot;  
   
  @Column(name="port")
   private int port;  
}

essa é uma solução.

G

fnandos, só não entendi porque você citou a mesma coisa que eu escrevi logo acima :slight_smile:

Porém sua classe possui um @Entity na classe de PK. Deve ser @Embeddable.

pauloperes, esqueci de dizer, você precisa serializar suas PKs. Vou editar meu post.

fnandos

garcia-jj, vc foi mais rápido do que eu pra postar, quanto a anotation, não lembrei

pauloperes

Galera,

fiz o que vcs falaram deu certo, porem agora quando dou um select na minha tabela, demora muito tempo, estou usando o posgres, tem algo que eu possa fazer?

Att,

G

pauloperes:
Galera,

fiz o que vcs falaram deu certo, porem agora quando dou um select na minha tabela, demora muito tempo, estou usando o posgres, tem algo que eu possa fazer?

Att,

Isso é muito dificil saber. Eu uso pgsql em uma aplicação muito grande minha e tudo rola sem problemas. Mas aconselho a você verificar se está com o último driver, se os dados de conexão estão todos corretos, e se você conecta em banco local ou remoto, se está usando conexão direta, pool manual ou pool gerenciado.

Também é importante conectar pelo pgadmin3 direto no banco e ver o tempo de demora. Talvez possa haver problema no banco mesmo ,não na aplicação. É ideal também consultar os logs para uma eventual mensagem.

Abraços

Criado 27 de outubro de 2009
Ultima resposta 27 de out. de 2009
Respostas 8
Participantes 3