Oi Tiago. Muito pertinente sua dúvida.
Pense nesse exemplo. Tendo uma classe com uma chave composta:
@Entity
@Table(name = "employees")
public class Employee implements Serializable {
@EmbeddedId
private EmployeeId employeeId;
private String name;
@Column(unique = true)
private String email;
private String phoneNumber;
public Employee() {
}
Para esse relacionamento usando Spring Data JPA, você precisa criar uma classe de chave primária composta separadamente com a anotação @Embeddable, assim:
@Embeddable
public class EmployeeId implements Serializable {
@Column(name = "employee_id")
private Long employeeId;
@Column(name = "department_id")
private Long departmentId;
public EmployeeId() {
}
public EmployeeId(Long employeeId, Long departmentId) {
this.employeeId = employeeId;
this.departmentId = departmentId;
}
Então sua interface JpaRepository fica assim:
public interface EmployeeRepository extends JpaRepository<Employee, EmployeeId> {
// TODO: add queries
}
Pense que Long também é um objeto, então basta que minha chave composta seja um objeto também, nesse caso EmployeeId, que eu possa usar na minha Repository.
Para entender melhor leia esse artigo aqui