Incorporadas
Explicação
@Embeddable
No contexto do JPA, @Embeddable
é uma anotação que indica que uma classe pode ser incorporada (embutida) dentro de outra entidade. Isso permite modelar atributos complexos como objetos embutidos dentro de uma entidade, em vez de criar uma entidade separada no banco de dados.
Características principais:
- Reutilização: Classes marcadas como
@Embeddable
podem ser reutilizadas em várias entidades. Não são entidades independentes: Elas não têm uma identidade própria, como uma chave primária. - Incorporadas em entidades: São usadas em combinação com a anotação @Embedded na classe que as utiliza.
Vantagens:
- Reduz complexidade quando não há necessidade de modelar uma entidade separada.
- Melhora a organização e a reutilização de código, principalmente para atributos comuns em várias entidades.
Assim, @Embeddable
é útil para modelar componentes que não precisam de identidade própria, mas fazem parte de uma entidade maior.
Exemplo
Imagine que você tem uma entidade Cliente e deseja modelar um endereço. Em vez de criar uma entidade Endereco separada, você pode usar @Embeddable para simplificar:
import jakarta.persistence.Id;
import jakarta.persistence.Entity;
import jakarta.persistence.OneToOne;
@Entity
public class Cliente {
@Id
private Integer id;
private String nome;
@Embedded // Marca o Endereco como embutido na entidade Cliente
private Endereco endereco;
}
@AttributeOverride
@AttributeOverride
A anotação @AttributeOverride
é utilizada dentro da entidade que contém a classe embutida. Você usa @AttributeOverride
para sobrescrever o nome das colunas ou outros aspectos de cada atributo dentro da classe embutida.
Para simular uma relação entre o Cliente
e o Telefone
usando o conceito de @Embeddable e explorar o conceito de @AttributeOverride do JPA, podemos criar uma classe Telefone com os atributos ddd e numero, e depois incorporar diferentes tipos de telefone (fixo e comercial) à entidade Cliente.
A ideia é utilizar o @AttributeOverride para alterar o nome das colunas associadas ao Telefone em cada tipo de telefone (fixo e comercial), permitindo um controle maior sobre os nomes das colunas no banco de dados.
import javax.persistence.*;
@Embeddable
public class Telefone {
private String ddd;
private String numero;
}
@Embeddable
e @Embedded
o JPA não espera que exista uma tabela própria para a classe Endereco
mas sim que colunas existam na tabela de Cliente
.Sabia Que?
Sabia que é possível combinar alguns conceitos do JPA para deixar o seu projeto mais versátil e aderente ao seu modelo de dados? Pois é, o JPA é um podero recurso que se você dominá-lo, conseguirá realizar inúmeras abordagens em seu desenvolvimento.
Vamos imaginar que o sistema agora necessite de apresentar uma alternativa que seus clientes possam registrar uma mais parentes com seu respectivo grau de parentesco para fins de contato de emergência.
No início pode parecer uma abordagem complexa que remete usar OneToMany outra abordagem similar, mas neste caso, podemos combinar as anotações @Embeddable
e ElementCollection
conforme exemplo abaixo:
import javax.persistence.*;
@Embeddable // A classe Parente pode ser embutida em outra entidade.
public class Parente {
private String nome;
@Column(name = "grau_parentesco")
private String grauParentesco;
}