Diferença entre @JoinColumn e mappedBy

Diferença entre @JoinColumn e mappedBy

1. Introdução

Os relacionamentos JPA podem ser unidirecionais ou bidirecionais. Significa simplesmente que podemos modelá-los como um atributo em exatamente uma das entidades associadas ou em ambas.

Definir a direção do relacionamento entre entidades não afeta o mapeamento do banco de dados. Ele define apenas as direções nas quais usamos esse relacionamento em nosso modelo de domínio.

Para um relacionamento bidirecional, geralmente definimos:

  • o lado dono

  • inverso ou o lado de referência

A anotação@JoinColumn nos ajuda a especificar a coluna que usaremos para ingressar em uma associação de entidade ou coleção de elementos. Por outro lado, o atributomappedBy é usado para definir o lado de referência (lado não proprietário) do relacionamento.

Neste tutorial rápido, veremosthe difference between @JoinColumn and mappedByin JPA. We’ll also present how to use them in a one-to-many association.

2. Configuração inicial

Para acompanhar este tutorial, digamos que temos duas entidades:EmployeeeEmail.

Claramente, um funcionário pode ter vários endereços de email. No entanto, um determinado endereço de email pode pertencer exatamente a um único funcionário.

Isso significa que eles compartilham uma associação um para muitos:

image

Também em nosso modelo RDBMS, teremos uma chave estrangeiraemployee_id em nossa entidadeEmail referindo-se ao atributoid de umEmployee.

3. @JoinColumn Anotação

Em um relacionamento Um-para-Muitos / Muitos-para-Um,the owning side is usually defined on the ‘many' side of the relationship. geralmente é o lado que possui a chave estrangeira.

A anotação@JoinColumn define o mapeamento físico real do lado da propriedade:

@Entity
public class Email {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "employee_id")
    private Employee employee;

    // ...

}

Significa simplesmente que nossa entidadeEmail terá uma coluna de chave estrangeira chamadaemployee_id referindo-se ao atributo primárioid de nossa entidadeEmployee.

4. AtributomappedBy

Depois de definirmos o lado proprietário do relacionamento, o Hibernate já possui todas as informações necessárias para mapear esse relacionamento em nosso banco de dados. Para tornar essa associação bidirecional, tudo o que temos que fazer é definir o lado da referência. O lado inverso ou de referência simplesmente mapeia para o lado proprietário.

Podemos usar facilmente o atributomappedBy da anotação@OneToMany para fazer isso. Então, vamos definir nossa entidadeEmployee:

@Entity
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "employee")
    private List emails;

    // ...
}

Aqui,the value of mappedBy is the name of the association-mapping attribute on the owning side. Com isso, agora estabelecemos uma associação bidirecional entre nossas entidadesEmployeeeEmail.

5. Conclusão

Neste tutorial, vimos a diferença entre@JoinColumnemappedBy e como usá-los em um relacionamento bidirecional um para muitos.

A anotação@JoinColumn define o mapeamento físico real no lado do proprietário. Por outro lado, o lado da referência é definido usando o atributomappedBy da anotação@OneToMany.

Como de costume, o código-fonte está disponívelover on Github.