JPA @Embedded E @Embeddable

JPA @Embedded E @Embeddable

1. Visão geral

Neste tutorial, veremos como podemos mapear uma entidade que contém propriedades incorporadas para uma única tabela de banco de dados.

Portanto, para esse propósito, usaremos as anotações@Embeddablee@Embedded fornecidas porJava Persistence API (JPA).

2. Contexto do Modelo de Dados

Em primeiro lugar, vamos definir uma tabela chamadacompany.

A tabelacompany armazenará informações básicas, como nome da empresa, endereço e telefone, bem como as informações de uma pessoa de contato:

public class Company {

    private Integer id;

    private String name;

    private String address;

    private String phone;

    private String contactFirstName;

    private String contactLastName;

    private String contactPhone;

    // standard getters, setters
}

The contact person, though, seems like it should be abstracted out to a separate class. O problema é quewe don’t want to create a separate table for those details. Então, vamos ver o que podemos fazer.

3. @Embeddable

JPA fornece a anotação@Embeddable para declarar que uma classe será incorporada por outras entidades.

Vamos definir uma classe para abstrair os detalhes da pessoa de contato:

@Embeddable
public class ContactPerson {

    private String firstName;

    private String lastName;

    private String phone;

    // standard getters, setters
}

4. @Embedded

A anotação JPA@Embedded é usada para incorporar um tipo em outra entidade.

Vamos agora modificar nossa classeCompany. Adicionaremos as anotações JPA e também mudaremos para usarContactPerson em vez de campos separados:

@Entity
public class Company {

    @Id
    @GeneratedValue
    private Integer id;

    private String name;

    private String address;

    private String phone;

    @Embedded
    private ContactPerson contactPerson;

    // standard getters, setters
}

Como resultado, temos nossa entidadeCompany, incorporando detalhes da pessoa de contato e mapeando para uma única tabela de banco de dados.

Ainda temos mais um problema, porém, que éhow JPA will map these fields to database columns.

5. Substituição de Atributos

O fato é que nossos campos eram chamados de coisas comocontactFirstName em nossa classeCompany original e agorafirstName em nossa classeContactPerson . Portanto, o JPA desejará mapear esses paracontact_first_name andfirst_name, respectivamente.

Além de ser menos do que ideal, ele realmente nos quebrará com nossa colunaphone agora duplicada.

Portanto, podemos usar@AttributeOverridese@AttibuteOverride para substituir as propriedades da coluna de nosso tipo incorporado.

Vamos adicionar isso ao campoContactPerson  em nossaCompany entity:

@Embedded
@AttributeOverrides({
  @AttributeOverride( name = "firstName", column = @Column(name = "contact_first_name")),
  @AttributeOverride( name = "lastName", column = @Column(name = "contact_last_name")),
  @AttributeOverride( name = "phone", column = @Column(name = "contact_phone"))
})
private ContactPerson contactPerson;

Observe que, como essas anotações entram em campo, podemos ter substituições diferentes para cada entidade envolvente.

6. Conclusão

Neste tutorial, configuramos uma entidade com alguns atributos incorporados e os mapeamos para a mesma tabela de banco de dados que a entidade envolvente. Para isso, usamos as anotações@Embedded,@Embeddable,@AttributeOverridese@AttributeOverride fornecidas pela Java Persistence API.

Como sempre, o código-fonte do exemplo está disponívelover GitHub.