Java Enterprise Edition - JEE
03. Trabalhando com relacionamentos
Melhorando o modelo
Operações realizadas em contas:
Pagamento de contas;
Recebimento de salários;
Recebimento de salários;
Transferência de valores;
Essas operações são Movimentações da conta;
Cada Movimentação pode ser de
Diagrama de classes
Pensando em mapeamento
A implementação da JPA tenta
converter o tipo JAVA para o tipo adequado no banco de dados;
adequado no banco de dados;
Exemplo: Um atributo String é mapeado para um campo varchar;
Com isso, não temos um mapeamento
de um Enum diretamente para um tipo
do banco de dados;
Trabalhando com ENUMs
@Enumerated – mapeamento de Enum;
Duas abordagens de mapeamento:
EnumType.ORDINAL – int, iniciando em zero. É
EnumType.ORDINAL – int, iniciando em zero. É a abordagem padrão;
EnumType.STRING – varchar, nome da
constante;
Cardinalidade de mapeamento
A classe Movimentacao possui um atributo Conta;
Como será o mapeamento da JPA:
Como será o mapeamento da JPA:
Varchar, int, decimal?
Precisamos mapear um relacionamento, que no BD, é baseado em chave
estrangeira;
Cardinalidade de mapeamento
Para mapear relacionamentos, precisamos informar apenas a cardinalidade;
No nosso exemplo, podemos ter muitas
No nosso exemplo, podemos ter muitas Movimentações para uma Conta
Para representar esse tipo de
relacionamento, usamos @ManyToOne;
Entendendo os campos
No mapeamento anterior, a JPA espera que exista uma tabela Movimentacao
com o campo conta_id, que é uma com o campo conta_id, que é uma chave estrangeira que aponta para o campo id da tabela Conta;
Mas o que acontece quando campo chave estrangeira tem um nome
diferente do padrão?
Mapeando relacionamentos
Podemos incluir a anotação @JoinColumn, a fim de customizar o nome do campo que representa a chave estrangeira;
representa a chave estrangeira;
A propriendade name indica o nome do
campo na tabela Movimentacao;
Exercício 01 – Tipo Movimentacao
Implemente o Enum TipoMovimentacao,
conforme descrito a seguir:
Exercício 02 – Movimentacao
Exerc. 03 – MovimentacaoDAO
Teste de persistência
Vamos criar uma classe de teste
Criar um EntityManager;
Criar uma Movimentação;
Criar uma Movimentação;
Criar um DAO; e
Persistir o objeto criado;
Movimentação sem conta
Inclusão da conta
Como resultado ao problema
apresentado no slide anterior, podemos criar e povoar um objeto Conta;
criar e povoar um objeto Conta;
Em seguida, atribuímos a conta criada à movimentação;
Qual o problema com o código do slide
Inclusão da conta
TransientObjectException
Ao persistirmos uma entidade, todas as entidades relacionadas devem estar
persistidas, também. Do contrário...
Resolvendo o TransientObject
Antes de persistir o objeto Movimentacao, podemos persistir o objeto Conta;
Com isso, podemos criar uma nova Conta e
Com isso, podemos criar uma nova Conta e atribuí-la a uma nova Movimentação;
Quando não queremos criar uma nova conta, mas usar uma já cadastrada,
precisamos informar um id válido para a
conta de uma determinada movimentação;
Exercício 04-TestePersistencia
Exercício 05 TesteConsultar
Referências
www.caelum.com.br
http://hibernate.org/docs
Hall, Marty, “Core Servlets and Java Server
Hall, Marty, “Core Servlets and Java Server Pages”, Janeiro 2002, Sun Microsystems
Press;