Modo mais eficiente para mapear uma @OneToMany relação com JPA e Hibernate
Eu escolhi abrir este post com esta citação porque sou fã de Linus Torvalds.😉
Este é o meu primeiro artigo de sempre. Neste eu estarei cobrindo todos os casos possíveis em One-to-Many/Many-to-One associação de entidades. Restantes Many-to-Many e One-to-One serão cobertos nos próximos artigos.
Eu espero que isto definitivamente ajude todos os novatos que querem aprender jpa/hibernate, Por favor leia a peça inteira 😛
NOTE:
Aqui eu cobri todos os casos possíveis de One-to-Many/Many-to-One mapeamento. Entre todos , a associação Bidirecional `@OneToMany` é a melhor maneira de mapear uma relação de um para muitos bancos de dados.
A associação hibernar classificada em One-to-One, One-to-Many/Many-to-One e Many-to-Many.
A direcção de uma relação pode ser bidireccional ou unidireccional.
Uma relação bidireccional tem tanto um lado proprietário como um lado inverso.
Uma relação unidireccional tem apenas um lado proprietário. O lado proprietário de uma relação determina como o tempo de execução da Persistência faz atualizações da relação no banco de dados.
Unidirecional é uma relação onde um lado não sabe sobre a relação.
Em uma relação unidirecional, apenas uma entidade tem um campo de relação ou propriedade que se refere à outra. Por exemplo, o Item do documento teria um campo de relação que identifica o Produto, mas o Produto não teria um campo de relação ou propriedade para o Item do documento. Em outras palavras, o Item sabe sobre o Produto, mas o Produto não sabe quais instâncias de Item se referem a ele.
Relações bidirecionais:
Relação bidirecional fornece acesso de navegação em ambas as direções, para que você possa acessar o outro lado sem consultas explícitas.
Em uma relação bidirecional, cada entidade tem um campo ou propriedade de relação que se refere à outra entidade. Através do campo ou propriedade de relação, o código de uma classe de entidade pode acessar seu objeto relacionado. Se uma entidade tem um campo relacionado, diz-se que a entidade “conhece” o seu objeto relacionado. Por exemplo, se Order sabe quais instâncias de Line Item tem e se Line Item sabe a que Order pertence, eles têm uma relação bidirecional.
As relações bidirecionais devem seguir estas regras.
O lado inverso de uma relação bidirecional deve se referir ao seu próprio lado (Entidade que contém a chave estrangeira) usando o elemento mappedBy do elemento @OneToOne, @OneToMany, ou @ManyToMany anotação. O elemento mappedBy designa a propriedade ou campo na entidade que é a proprietária da relação.
Os muitos lados de @ManyToOne relações bidirecionais não devem definir o elemento mappedBy. Os muitos lados são sempre o lado proprietário da relação.
Para @OneToOne relações bidirecionais, o lado proprietário corresponde ao lado que contém @JoinColuna, ou seja, a chave estrangeira correspondente.
Para @ManyToMany relações bidirecionais, cada lado pode ser o lado de propriedade.
@UmaToMuita relação com JPA e Hibernate
Simplesmente colocado, um-para-muitos mapeamentos significa que uma linha em uma tabela é mapeada para várias linhas em outra tabela.
Quando usar um para muitos mapeamentos
Utilizar um para mapear para criar 1…N relação entre entidades ou objetos.
Temos que escrever duas entidades i.e. Company e Branch de modo que várias filiais possam ser associadas a uma única empresa, mas uma única filial não pode ser compartilhada entre duas ou mais empresas.
Hibernar uma a muitas soluções de mapeamento:
Um a muitos mapeamentos com associação de chaves estrangeiras
Um a muitos mapeamentos com tabela de join
Este problema pode ser resolvido de duas formas diferentes.
Uma é ter uma coluna de chaves estrangeiras na tabela de filiais, ou seja company_id. Esta coluna irá se referir à chave primária da tabela da Empresa. Desta forma não podem ser associadas duas filiais a múltiplas empresas.
Segunda abordagem é ter uma tabela de junção comum, digamos Company_Branch, Esta tabela terá duas colunas i.e. company_id que será chave estrangeira referindo-se a chave primária na tabela de Empresa e de forma similar branch_id que será chave estrangeira referindo-se a chave primária da tabela de Filiais.
Se @OneToMany/@ManyToOne não tiver uma associação @ManyToOne/@OneToMany respectivamente no lado infantil, então a associação @OneToMany/@ManyToOne é unidirecional.
@OneToMany Relação Unidirecional
Nesta abordagem, qualquer entidade será responsável por fazer a relação e mantê-la. Ou a Empresa declara a relação como uma para muitas, ou a Filial declara a relação do seu fim como muitas para uma.
CASO 1: (Mapeamento com associação de chave estrangeira)
Se usarmos apenas @OneToMany então haverá 3 tabelas. Tais como company, branch e company_branch.