TDSI – Mapeamento objeto relacional (MOR) com JPA – ManyToOne / OneToMany

Mapamentos  OneToMany e ManyToOne Material complementar: aqui. Considerar o seguintes modelos conceitual e lógico:

Foi criado o pacote modelo e dentro deles as classes Depto e Funcionario, antes foi feito o mapeamento persistense.xml que foi visto na outra publicação com a Estratégia de criação de tabela criar,  se não existir no banco ele cria as tabelas pelo hibernate.

Link do código persistense.xml

1.Dentro do projeto criar um pacote chamado modelo. Depois baseado nos códigos abaixo criar as suas classes POJOs. Código para mapeamento da tabela Depto.java :

link do código

Código para mapeamento da tabela Funcionario.java : link do código

Dentro da tabela Depto esta o mapeamento um para muitos e na tabela Funcionario esta o muitos para um, por que? Um departamento podem estar trabalhando muitos funcionários.

E na tabela funcionário está o mapeamento inverso ou seja muitos funcionários estão lotados em no máximo um departamento, um funcionário pode estar lotado em no máximo um departamento.

O trecho do código dentro de Depto.java para OneToMany

@Entity
@Table (name="depto")

Esta anotação diz que a classe é persistível e o nome da tabela no banco de dados chama-se depto.

Para geração de auto-incremento pode usar sequences:

@Id  
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "depto_seq_gen")
@SequenceGenerator(name = "depto_seq_gen",sequenceName="depto_id_seq",allocationSize = 1)
private Long id;

Ou forçar o JPA para criar um tipo Serial:

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

Essas annotations servem para dizer que a política de geração de códigos do departamento é usado o conceito de sequence, que nem um serial. Column (name=”id”) diz que no banco de dados a chave primária é id.

@Column(length=50)
private String nome;

diz que o tamanho máximo da coluna nome é de 50 caracteres.

@OneToMany  (mappedBy="depto")
private List Funcionario funcionarios;

faz o mapeamento dizendo que o lado muitos esta na tabela do banco de dados chamada depto.  O mappedBy nesse tipo de mapeamento sempre vai no lado OneToMany. A omissão dessa cláusula criaria desnecessariamente uma terceira tabela.   O trecho do código dentro de Funcionario.java para ManyToOne

@ManyToOne
private Depto depto;

Aqui é feito o mapeamento muitos pra um, no caso traz o departamento que este funcionário esta lotado, muitos funcionários podem estar em no máximo um departamento.


@Temporal(TemporalType.DATE)
private Date nasc;

@Column(nullable=false,precision=8, scale=2)
private BigDecimal salario;

Para inserir  a data via código:

SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy");

Date data = sdf.parse("15/1/1998");

Funcionario.setNasc(data);

Para inserir o salario de R$ 1.500,66 :

Funcionario.setSalario(new BigDecimal("1500.66"));

 

Para inserir o salario de R$ 2.000,00 :

Funcionario.setSalario(new BigDecimal("2000"));

 

A primeira diz que o nome o nome da coluna nasc na classe é no banco chamada de nascimento e é tipo temporal.

A segunda diz que o salário esta mapeada como salario e tem 10 de precisão e 2 de escala ou seja:  salario numeric(10,2)  no banco de dados.

Segundo a especificação JPA, as instâncias das entidades são administradas pelos Entity Managers. As duas principais responsabilidades dos Entity Managers são gerenciar o estado dos objetos e sincronizar os dados da aplicação e do banco de dados.

Para manipular as entidades da nossa aplicação, devemos utilizar um EntityManager que é obtido através de uma EntityManager Factory.

Na classe principal Main() vamos inserir o seguinte código Link do código

EntityManagerFactory factory =
Persistence.createEntityManagerFactory("aulahibernate1PU");
EntityManager manager = factory.createEntityManager();

Os códigos a seguir persistem os dados no banco de dados, veja no link abaixo: Link do código completo dentro da classe principal Main() A novidade na classe funcionario.class é a anotação ManyToOne

@ManyToOne
private Depto depto;

Diz que o atributo depto mapeia o lado um do relacionamento. Próximo post: Mapeamento Muitos para Muitos sem atributos.

Esse post foi publicado em TDSI - Tópicos em Desenvolvimento de Sistemas de Informação I e III e marcado , , , . Guardar link permanente.

2 respostas para TDSI – Mapeamento objeto relacional (MOR) com JPA – ManyToOne / OneToMany

  1. Tirou muitas dúvidas minha, obrigado.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s