2
respostas

Chave primaria composta

Tenho uma tabela e preciso informar a chave primária. Mas no caso existem dois campos que são a chave primária.

Então como vou informar, já que @id é para apenas um atributo.

@id private int id1; private int id2; private String texto;

Neste exemplo o "id1" é a chave primaria, MAS a chave do banco de dados Mysql é composta de id1, id2.

Como fazer?

2 respostas

Olá Fábio! Tudo bem?

Para lidar com chaves primárias compostas no JPA com Hibernate, você pode usar a anotação @EmbeddedId ou @IdClass. Vou te explicar como usar cada uma delas.

  1. Usando @EmbeddedId:

    Primeiro, você precisa criar uma classe embutida que represente a chave composta. Essa classe deve implementar Serializable e conter os campos que compõem a chave primária.

    import java.io.Serializable;
    import javax.persistence.Embeddable;
    
    @Embeddable
    public class ChaveComposta implements Serializable {
        private int id1;
        private int id2;
    
        // Construtores, getters, setters, hashCode e equals
    }
    

    Depois, na sua entidade, você usa a anotação @EmbeddedId:

    import javax.persistence.Entity;
    import javax.persistence.EmbeddedId;
    
    @Entity
    public class SuaEntidade {
        @EmbeddedId
        private ChaveComposta chaveComposta;
    
        private String texto;
    
        // Getters e setters
    }
    
  2. Usando @IdClass:

    Outra abordagem é usar a anotação @IdClass. Você também precisa de uma classe para representar a chave composta, mas desta vez você não usa @Embeddable.

    import java.io.Serializable;
    
    public class ChaveComposta implements Serializable {
        private int id1;
        private int id2;
    
        // Construtores, getters, setters, hashCode e equals
    }
    

    Na sua entidade, você especifica a classe da chave composta com @IdClass:

    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.IdClass;
    
    @Entity
    @IdClass(ChaveComposta.class)
    public class SuaEntidade {
        @Id
        private int id1;
    
        @Id
        private int id2;
    
        private String texto;
    
        // Getters e setters
    }
    

Ambas as abordagens são válidas, e você pode escolher a que melhor se adapta ao seu caso.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Ok, muito obrigado.