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:
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.