ElementCollection
Explicação
A notação @ElementCollection do JPA (Java Persistence API) é usada para mapear coleções de tipos básicos ou embutidos (tipos simples como String, Integer, Date, entre outros) ou objetos embutidos (classes anotadas com @Embeddable). Ela é comumente utilizada para armazenar coleções de dados simples em uma tabela separada, mas sem necessidade de criar uma entidade dedicada.
@ElementCollection
Vamos ilustrar isso com o exemplo de um relacionamento entre um Cliente e uma coleção de emails que ele possa ter. A ideia é modelar um cliente que pode ter vários emails, mas sem precisar de uma entidade Email separada.
Exemplo
- Definindo a Entidade 
Cliente 
A classe Cliente vai ter uma coleção de emails, que será mapeada usando a anotação @ElementCollection. Para armazenar os emails, o JPA cria uma tabela adicional (de forma implícita) para gerenciar essa coleção.
import javax.persistence.*;
import java.util.Set;
@Entity
public class Cliente {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String nome;
    @ElementCollection
    @Column(name = "email") 
    private Set<String> emails;  // Coleção de emails
    // Lombok ou Getters e Setters
 
}
cliente_email que representará a relação entre um cliente e seus respectivos emails.
Consulte a sua base de dadosExplicação das Anotações:
- @Entity: Marca a classe como uma entidade JPA, ou seja, ela será mapeada para uma tabela no banco de dados.
 - @Id e @GeneratedValue: Indicam que o campo 
idé a chave primária da entidade e que o valor será gerado automaticamente. - @ElementCollection: Indica que o campo 
emailsé uma coleção de elementos simples (neste caso,String). O JPA vai tratar isso de forma especial, criando uma tabela para armazenar esses valores de forma associada à entidadeCliente. - @Column: Especifica o nome da coluna (
email) na tabela de coleção. 
Estrutura da Tabela no Banco de Dados
Com essa estrutura, o JPA vai gerar as seguintes tabelas:
- Cliente
 
id(PK)nome
- cliente_email
 
cliente_id(FK paraCliente)email
Por exemplo, a tabela cliente_email pode ter os seguintes registros:
| cliente_id | |
|---|---|
| 1 | cliente1@email.com | 
| 1 | cliente2@email.com | 
| 2 | cliente3@email.com | 
| 2 | cliente4@email.com | 
A tabela Cliente pode ter registros como:
| id | nome | 
|---|---|
| 1 | João | 
| 2 | Maria | 
Consultando os Dados
Se você tiver um objeto Cliente no seu código, você pode acessar a lista de emails diretamente:
Cliente cliente = //seu repository ou entitymanager
Set<String> emails = cliente.getEmails();
for (String email : emails) {
    System.out.println(email);
}
Vantagens do @ElementCollection:
- Não há necessidade de criar uma entidade separada para representar os emails.
 - A tabela associada é criada automaticamente.
 - O JPA lida com a persistência da coleção de maneira eficiente.
 
Limitações:
- Não é possível fazer operações complexas com essas coleções (como fazer consultas diretamente na tabela de emails). Elas são basicamente uma estrutura simples de dados.
 - Não há suporte para relacionamentos mais complexos (como 
ManyToManyouOneToMany), pois o foco do@ElementCollectioné trabalhar com coleções simples. 
CollectionTable
A anotação @CollectionTable em JPA é utilizada em conjunto com @ElementCollection para mapear coleções de elementos embutidos ou coleções de tipos básicos em uma tabela separada no banco de dados.
Estrutura da Anotação
@CollectionTable(
    name = "nome_da_tabela",
    joinColumns = @JoinColumn(name = "coluna_de_chave_estrangeira")
)
Exemplo Prático
Imagine a nossa entidade Cliente agora precisar identificar que na sua lista de e-mails os mesmos tenham um ou mais atributos como por exemplo, tipo podendo PESSOAL ou CORPORATIVO.
@Embeddable que é explorada em nosso tema Anotações Avançadas Incorporadas.import jakarta.persistence.*;
@Embeddable
public class Email {
    //SEM NECESSIDADE DE ID
    //@Id
    //private Integer id;
    private String destinatario;
    private String tipo;
    
     // Lombok ou Getters e Setters
    
}
Conclusão
A anotação @ElementCollection do JPA é uma maneira conveniente de mapear coleções simples de dados como strings (no caso dos emails) sem a necessidade de criar uma entidade extra. Isso torna a estrutura de dados mais limpa e fácil de trabalhar quando o relacionamento entre as entidades não exige um modelo mais complexo.