Diferença e Qual utilizar | Embeddable e IdClass|

Pessoal estou com uma dúvida na utilização de chaves compostas em JPA. não encontrei nenhum tópico que tratava disso e resolvi iniciar uma discussão sobre.

O que me dizem sobre?

IdCass - Te dá um pouco de trabalho, mas deixa mais claro quais chaves você quer da classe por exemplo, tenho duas classes Jogador e TimeId. Jogador poderá ser buscado pelo time, nome e id

@Entity
@IdClass(TimeId.Class)
public class Jogador {

@Id 
private String time;

@Id 
private String nome;

@Id
private int id;

}

@Embeddable //não virara entidade no db
public class TimeId implements Serializable {
   private String time;
   private String nome;

   public TimeId( ) {  }

  public TimeId(String time, String nome) { super( ); //omitido

}
//omitido
}

EmbeddedId com EmbeddedId é um pouco diferente, eu só preciso indicar que o TimeId terá as chaves compostas do Jogador ou seja, não há necessidade de colocar os ids no Jogador.

public class Jogador {

@EmbeddedId
private TimeId id;
}

Outro exemplo de classes para ficar mais claro.

Embedded - Indica que os atributos da classe indicada será anexada a classe onde está sendo chamada

Embeddable - Indica que a classe não virara uma entidade no seu db

@Entity
public class Usuario {

private String nome;

@Embedded
private Endereco endereco; //Atributos da classe Endereco será anexada ao usuário, deixando a classe mais limpa.

//omitido
}

@Embeddable //Indica que a classe não virara uma Entidade no seu db
public class Endereco {


}

Coloquei outras anotações, porque eles são relacionados.

Muito obrigado pela resposta, me ajudou consequentemente dezena de pessoas com a mesma dúvida.

Grato

Opa, estamos ai para isso.

No caso não tera como escapar de um estudo profundo, Recomendo esse ótimo livro da casa do código. O único problema que você vai enfrentar e que esse livro não aborda é no caso @ManyToMany. Com o resto dá para se virar de boa.

JPA é uma mão na roda <3

Eu tenho o JSF e JPA da casa do código. Muito bom