Articles

hibernar um a muitos tutoriais de anotações

introdução

Este tutorial de hibernação rápida irá nos levar através de um exemplo de um mapeamento de um a muitos usando anotações JPA, uma alternativa ao XML.também vamos aprender quais são as relações bidirecionais, como elas podem criar inconsistências, e como a ideia de propriedade pode ajudar.

leitura adicional:

arranque de mola com Hibernato

um intro rápido e prático para integrar arranque de mola e Hibernato / JPA.
Read more →

An Overview of Identifiers in Hibernate/JPA

Learn how to map entity identifiers with Hibernate.
Read more →

Description

simply put, one-to-many mapping means that one row in a table is mapped to multiple rows in another table.

vejamos a seguinte entidade relacionamento diagrama para ver um um-para-muitos associação:

Para este exemplo, vamos implementar um sistema de carrinho de onde temos uma tabela para cada carrinho e outra tabela para cada item. Um carrinho pode ter muitos itens, então aqui temos um mapeamento de um para muitos.

A forma como isto funciona ao nível da base de dados é que temos um cart_id como uma chave primária na tabela cart e também um cart_id como uma chave estrangeira em itens.

A forma como o fazemos em código é com @OneToMany.

vamos mapear a classe Cart para os itens objeto de uma forma que reflete a relação na base de dados:

public class Cart { //... @OneToMany(mappedBy="cart") private Set<Items> items; //...}

podemos também adicionar uma referência ao Cart em itens usando @Manitoone, tornando esta uma relação bidirecional. Bidirecional significa que somos capazes de acessar itens de carroças, e também carros de itens.

a propriedade mapped by é o que usamos para dizer hibernar que variável estamos usando para representar a classe pai em nossa classe de filhos.

As seguintes tecnologias e bibliotecas são usadas para desenvolver um exemplo de aplicação do Hibernate que implementa um-para-muitos associação:

  • JDK 1,8 ou mais tarde
  • Hibernate 5
  • Maven 3 ou mais tarde
  • H2 banco de dados

Configuração

3.1. Configuração da base de dados

abaixo está o nosso Programa de base de dados para tabelas de Cart e itens. Nós usamos a restrição de chave estrangeira para mapeamento de um para muitos:

nossa configuração de banco de dados está pronta, então vamos avançar para a criação do projeto de exemplo hibernado.

3, 2. Dependências Maven

Depois adicionaremos as dependências de hibernato e H2 ao nosso pom.ficheiro xml. A dependência do hibernado usa o login JBoss, e ele automaticamente é adicionado como dependências transitivas:

  • hibernar versão 5.2.7.Final
  • H2 driver Versão 1.4.197

por favor, visite o repositório central Maven para as últimas versões do Hibernate e das dependências H2.

3, 3. Configuração do hibernado

Aqui está a configuração do hibernado:

3.4. HibernateAnnotationUtil Class

With The HibernateAnnotationUtil class, we just need to reference the new Hibernate configuration file:

the Models

The mapping related configurations will be done using JPA annotations in the model classes:

@Entity@Table(name="CART")public class Cart { //... @OneToMany(mappedBy="cart") private Set<Items> items; // getters and setters}

Por Favor note que a anotação @OneToMany é usada para definir a propriedade na classe de itens que será usada para mapear a variável mapeada. É por isso que temos uma propriedade chamada “cart” na classe de itens:

também é importante notar que a anotação @ManyToOne está associada com a variável da classe Cart. @JoinColumn annotation references the mapped column.

Em Ação

No programa de teste, estamos criando uma classe com um método main() para obter a Session do Hibernate, e verão o modelo de objetos no banco de dados implementação de um-para-muitos associação:

Esta é a saída de nosso programa de teste:

O @ManyToOne Anotação

Como vimos na seção 2, podemos especificar um muitos-para-um relacionamento usando o @ManyToOne anotação. Um mapeamento de muitos para um significa que muitas instâncias desta entidade são mapeadas para uma instância de outra entidade – muitos itens em um carrinho.

a anotação @ManyToOne permite-nos criar também relações bidirecionais. Vamos cobrir isto em detalhe nas próximas subsecções.

6. 1. Inconsistências e propriedade

Agora, se os itens referenciados Cart, mas os itens não por sua vez Cart de Referência, nossa relação seria unidirecional. Os objetos também teriam uma consistência natural.no entanto, no nosso caso, a relação é bidirecional, trazendo a possibilidade de inconsistência.

Vamos imaginar uma situação onde um desenvolvedor deseja adicionar item1 carrinho de compras ” e item2 para cart2, mas comete um erro, de modo que as referências entre cart2 e item2 tornar-se inconsistente:

Como mostrado acima, item2 referências cart2, considerando que cart2 não faz referência a item2, e isso é ruim.como deve hibernar gravar o item2 na base de dados? Será que tem2carro de referência chave estrangeiro 1 ou cart2?

resolvemos esta ambiguidade usando a ideia de um lado proprietário da relação; as referências pertencentes ao lado proprietário têm precedência e são guardadas no banco de dados.

6, 2. Items as the Owning Side

As stated in the JPA specification under section 2.9, it’s a good practice to mark many-to-one side as the owing side.

em outras palavras, itens seriam o lado proprietário e Cartear o lado inverso, que é exatamente o que fizemos anteriormente.então como conseguimos isto?

ao incluir o atributo mappedy na classe Cart, marcamo-lo como o lado inverso.

ao mesmo tempo, também anotamos os itens.cart field com @ManyToOne, fazendo itens o lado proprietário.

voltando ao nosso exemplo de “inconsistência”, agora hibernar sabe que a referência do item2 é mais importante e irá salvar a referência do item2 à base de dados.

vamos verificar o resultado:

item1 ID=1, Foreign Key Cart ID=1item2 ID=2, Foreign Key Cart ID=2

embora as referências do carrinho item2 no nosso excerto, a referência do item2 ao cart2 é guardada na base de dados.

6. 3. Cart como o lado proprietário

também é possível marcar o lado um-para-muitos como o lado proprietário, e muitos-para-um como o lado inverso.

embora esta não seja uma prática recomendada, vamos em frente e dar-lhe uma tentativa.

O trecho de código abaixo mostra a implementação de um-para-muitos, como o proprietário lado:

Observe que como nós removemos o mappedBy elemento e defina o muitos-para-um @JoinColumn como inserível e atualizável para false.

Se executar o mesmo código, o resultado será o oposto:

item1 ID=1, Foreign Key Cart ID=1item2 ID=2, Foreign Key Cart ID=1

Como mostrado acima, agora item2 pertence ao carrinho.

conclusão

vimos como é fácil implementar a relação de um para muitos com a base de dados Hibernada ORM e H2 usando anotações da App.além disso, aprendemos sobre as relações bidirecionais e como implementar a noção de um lado proprietário.