Documente Academic
Documente Profesional
Documente Cultură
Sempre que trabalhamos com uma conta bancria, realizamos pagamentos, recebemos salrios, transferimos dinheiro para outras contas e assim por diante. As operaes que realizamos em nossas contas so tambm conhecidas como movimentaes, que a partir de agora vamos representar em nosso sistema. Cada Movimentacao deve ter um valor movimentado, tipo, data de realizao, descrio e tambm uma Conta vinculada.
anotaes @Entity para definir a entidade, juntamente com @Id e @GeneratedValue para a chave primria. Todas do pacote javax.persistence.
@Entity public class Movimentacao { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; }
O prximo atributo representa o valor da movimentao. A primeira ideia seria usar o tipo double para represent-lo, porm o double no tem a preciso suficiente. Ou seja, no deve ser utilizado para guardar valores financeiros. Utilizaremos
ENTRADA, SAIDA; }
Como agora o atributo uma Enum, precisamos anot-lo com @Enumerated. Alm disso, queremos mapear no banco de dados como sendo do tipo String. Precisamos ento
definir o parmetro EnumType para STRING. Isso significa que no registro do banco ficar gravado o varchar: SAIDA ou ENTRADA.
@Entity public class Movimentacao {
No Java, quando trabalhamos com datas, normalmente usamos o tipo Calendar. Mas como cada banco lida de formas diferentes com dados desse tipo, precisamos dizer para o JPA qual a forma que queremos armazenar a data no banco. Devemos ento primeiro anotar o atributo com @Temporal, depois definir o parmetro de preciso desejado (TemporalType). Aqui temos 3 opes:
DATE: somente a data, sem a hora; TIME: somente a hora, sem data; TIMESTAMP: tanto data quanto hora. No nosso caso guardamos apenas a data, sem a hora:
@Entity public class Movimentacao {
Por fim, falta a descrio da movimentao. Aqui no h novidade, ela ser do tipo String. Tambm j vamos gerar os getters e setters para cada atributo.
Definindo a relacionamento
cardinalidade
do
O JPA sempre tentar mapear os tipos do Java para os tipos adequados no banco de dados. Dessa forma, ao criar um atributo do tipo String no Java, ele ser mapeado para varchar no MySQL. Isso vale para os principais tipos do Java.
No entanto, nossa entidade Movimentacao ter um atributo Conta. Como o JPA mapear esse atributo no banco de dados? Um varchar ou um int? O que queremos mapear um relacionamento entre as entidades, que no banco dever ser refletido por uma chave estrangeira (Foreign Key). A nica informao que precisamos dizer qual a cardinalidade da Movimentacao em relao Conta. Na nossa aplicao, diversas movimentaes possuem uma nica conta. Esse relacionamento de muitos para um. Essa cardinalidade ns representamos no cdigo Java com a anotao @ManyToOne. Vamos ento anotar nosso atributo conta:
Com isso, a implementao do JPA gerar uma nova coluna na tabela Movimentacao que se chamar conta_id. Tambm vamos gerar o getter e setter para o atributo conta.
ATENO: No podemos esquecer de registrar a nova entidade Movimentacao no arquivo persistence.xml. Vamos editar o arquivo persistence.xml e acrescentar
<properties>
Movimentacao movimentacao = new Movimentacao(); movimentacao.setData(Calendar.getInstance()); movimentacao.setDescricao("Conta de luz"); movimentacao.setTipoMovimentacao(TipoMovimentacao.SAIDA); movimentacao.setValor(new BigDecimal("123.9"));
Por fim vamos associar os objetos conta e movimentacao, ou seja, chamando o mtodo setConta(..) da movimentao.
movimentacao.setConta(conta);
Movimentacao movimentacao = new Movimentacao(); movimentacao.setData(Calendar.getInstance()); movimentacao.setDescricao("Conta de luz"); movimentacao.setTipoMovimentacao(TipoMovimentacao.SAIDA); movimentacao.setValor(new BigDecimal("123.9"));
movimentacao.setConta(conta);
manager.persist(movimentacao);
manager.getTransaction().commit(); manager.close(); } }
Execute novamente o cdigo e veja como no recebemos mais a exceo. NOTA: No caso de querermos associar a Movimentacao a uma Conta previamente existente, bastaria atribuir um id j existente no banco de dados para uma nova Conta, e passar essa conta para a Movimentacao que ser persistida.