Chave composta no Hibernate

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

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?

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:

[code]@Entity
public class Port {
@EmbeddedId
private PortPK id;

[...]

}[/code]

[code]@Embeddable
public class PortPK implements Serializable {
@ManyToOne
private Shelf shelf;

private int slot;  

private int port;

}[/code]

Kra,

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

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.

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.

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

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,

[quote=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,[/quote]

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