Persistindo dados com TopLink no NetBeans O que é TopLink? O TopLink é uma ferramenta de mapeamento objeto/relacional para Java. Ela transforma os dados tabulares de um banco de dados em um grafo de objetos definido pelo desenvolvedor. Usando o TopLink, o desenvolvedor se livra de escrever muito do código de acesso a banco de dados e de SQL que ele escreveria não usando a ferramenta, acelerando a velocidade do seu desenvolvimento de uma forma fantástica. Mas o framework não é uma boa opção para todos os tipos de aplicação. Sistemas que fazem uso extensivo de stored procedures, triggers ou que implementam a maior parte da lógica da aplicação no banco de dados, contando com um modelo de objetos pobre não vai se beneficiar com o uso do TopLink. Ele é mais indicado para sistemas que contam com um modelo rico, onde a maior parte da lógica de negócios fica na própria aplicação Java, dependendo pouco de funções específicas do banco de dados. Ferramentas Necessárias para este tutorial. NetBeans IDE 6.1 ou Superior. MySQL 5.5 Modelando o sistema Com o NetBeans, utilize a plataforma UML para desenvolver o diagrama a seguir.
Criando o Projeto Logo após criar esse modelo crie um novo projeto no NetBeans, pode ser Java ou Web, no meu caso escolherei Java. Coloque o nome no seu projeto e clique em Finish.
Logo após criar seu projeto, crie o pacote model e gere o código do seu diagrama na pasta: src\model do seu Projeto Java. Ficará assim. Agora chegou a hora de importarmos os.jar s necessários para trabalhar com o TopLink. O próprio NetBeans já tem esses.jar s não precisando baixá-los. Para adicioná-las basta clicar com o botão direito do mouse em cima da pasta Libraries e escolher a opção Add Library. Agora basta escolher o.jar do TopLink Aproveite para adicionar também o dirver do MySql.
Mapeando as classes que serão persistidas no banco de dados Temos duas maneiras de mapear as classes que serão persistidas no banco; uma é através de arquivo.xml, e a outra, é através de Annotations. Por se tratar que arquivos.xml são mais fáceis do programador cometer erros e logo são difíceis de encontrá-los; trabalhamos então com Annotations. Obs: O TopLink, e até mesmo o Hibernate, exige que toda classe anotada que será persistida no banco; seja uma classe Bean (Uma classe que tenha um construtor padrão, e os métodos gets e sets). Anotando a classe Perfil
@Entity Especifica que essa classe é uma entidade. Uma entidade é um objeto que será persistido. Ela representa uma tabela no banco de dados relacional. @Table Especifica nome da tabela no banco de dados. @Id Mapeia uma chave primária simples. Cada entidade precisa possuir uma chave primária Chave pode ser gerada automaticamente: IDENTITY, AUTO, SEQUENCE, TABLE @Column Permite que se altere o nome do atributo no banco, defina o tamanho, se o atributo pode ser null e etc. Obs.: Por padrão todos os atributos de uma classe mapeada com @Entity são gerados dentro dessa tabela, qualquer problema ele gerará um erro e não cria a tabela. @OneToMany Entidade Cliente Serve para mapear relacionamentos neste caso eu sou um para muitos. Sempre nesta anotação devo indicar quem faz o mapeamento (mappedby="perfil"); neste caso digo que na tabela Usuario (O atributo que estou mapeando é do tipo Usuario) tenho um atributo chamado perfil, e lá está o mapeamento.
Anotando a classe Usuario @Temporal Utilizada para mapeamento de datas e hora. Recebe um valor como argumento que pode ser: TemporalType.DATE: usado para mapear datas; TemporalType.TIME: usado para mapear hora; TemporalType.TIMESTAMP: usado para mapear datas e hora.
@ManyToOne Entidade Pedido Sou muitos para um; indica que esse atributo será uma chave estrangeira FK na tabela usuarios no banco de dados. @JoinColumn É utilizada para informar qual o nome da coluna que corresponde à chave estrangeira do mapeamento, e o atributo da outra tabela referente a ela. Anotando a classe Material
Anotando a classe Solicitacao Cascade CascadeType: PERSIST: Quando uma nova entidade é persistida, todas as entidades na coleção são persistidas MERGE: Quando uma entidade desconectada é atualizada, todas as entidades na coleção são atualizadas REMOVE: Quando uma entidade existente é removida, todas as entidades na coleção são removidas ALL: Se aplicam todas as regras acima Esta anotação cascade é muito importante, pois quando insiro no banco uma solicitação tenho que inserir também os itens que compõem esta solicitação. Só é interessante usar o cascade quando tiver itens (itemdesolicitacao, itendevenda), pois os outros já estarão inseridos observe que só uso essa anotação aqui.
Anotando a classe ItemDeSolicitacao A classe ItemDeSolicitação, faz relacionamento entre as classes; Solicitação e Material; logo persistindo essa classe, ela terá duas chaves estrangeiras, que fazem relacionamento entre as classes que ela tem relação, que são: Solicitacao e Material. Naturalmente estas duas chaves poderiam ser a chave primária dessa tabela (chave composta); isso seria o mais natural, e é, o que usamos quando não temos um framework de persistência. Ex: JDBC. Quando utilizamos um framework de persistência ORM (TopLink, Hibernate e etc.) chaves compostas são sempre desencorajadas a se utilizar. O recomendado é criar uma nova chave para essa tabela e deixar que o banco controle ela. Não vai dar erro, e a velocidade, não altera muito. Observe que foi criado um Id para a classe ItemDeSolicitacao.
Configurando o TopLink Para configuração do TopLink precisaremos de um arquivo persistence.xml. Para facilitar de um clique em Source Packages, e pressione CTRL + N do seu teclado ele vai exibir a seguinte tela. Clique em Persistence -> Persistence Unit e depois clique clique em Next. Em Persistence Unit Name coloque o nome da sua persistência ele será referenciado no seu EntityManagerFactory. Em Persistence Library escolha TopLink.
Em Table Generation Strategy escolha: Create: se você quiser que o TopLink crie as tabelas no banco,; Drop and Create: se você já tiver as tabelas no banco e quiser apagar e criar as novas tabelas. None: Ele não faz nada, apenas inseri no banco, você tem que criar o banco manualmente. Escolha Create. Em Database Connection, é o local onde configuramos o banco de dados Obs.: Mesmo que você escolha Create em Table Generation Strategy você deve criar o banco no seu SGBD. Clique no combo, e escolha New Database Connection.. Na nova janela, escolha em Name o drive do MySql e configure as outras opções. Utilize as configurações abaixo Obs.: O nome do meu banco é almoxarifadotoplink; o administrador do meu banco é root sem senha.
Clique em OK. Ele te informa se conseguiu conectar com o banco. Clique novamente em OK Clique em Finish. Observe que aparece um arquivo persistence.xml dentro da pasta META-INF e logo ele já exibe o Design da persistência; você também pode alterar para o modo XML. Aproveite para clicar em Add Class e adicionar suas classes persistidas.
Configurando as DAOs DAO<T> Crie uma interface Dao no TopLinkDAO (este nome não é obrigatório, é só uma sugestão). Observe que estou usando uma interface genérica <T>. quando coloco este <T> digo que ela pode ser de qualquer tipo. Abaixo coloco as assinaturas dos métodos; eles também são genáricos. DaoFactory<T> Crie a classe DaoFactory, ela terá os métodos de inserir, alterar e remover; esta classe será uma classe abstract, isso porque não queremos que ele seja instanciada; só queremos herdar os métodos dela. Observe que ela deve implementar DAO<T>.
Observe que tenho dois atributos: EntityManagerFactory: é uma interface que gerência a conexão com o banco. Observe que no construtor, ele cria um EntityManagerFactory do Persistence passando o nome da sua persistência (no momento em que crio a persistência damos um nome; é esse nome). EntityManager: é uma interface que tem a função de gerar códigos SQL no banco. A partir do mapeamento de nossas classes. Métodos de DaoFactory: Na classe abstrata DaoFactory, temos 3 métodos implementados e dois abstratos; só com a assinatura. Os métodos de inserir, alterar e remover, são basicamente os mesmos só mudando uma linha; esses métodos também são genéricos, pois não indico de que tipo eles são; só informo que eles podem ser de qualquer tipo. Insert O método Insert é genérico aceitando qualquer tipo (o TopLink cuida disso para mim) dentro do bloco try coloco meu em(entitymanager) na transação, depois mando persistir meu objeto, esse método insere o objeto no banco, comito a transação e retorno true informando que a transação ocorreu como deveria. Caso ocorra algum erro ele dá uma rollback na transação cancelando ela e retornando false, indicando que deu erro. No bloco finally fecho o em.
Update Observe que a única coisa que mudou ao invés de eu usar persist no updade eu utilizo merge; este tem a função de atualizar o objeto, caso este não exista ele insere outro.
Delete Os métodos getlista e getobject são abstratos, devendo ser implementados pelas classes que estenderem DaoFactory. Antes de criar as classes DAO que representam o seu modelo temos que criar as nossas Queries, que são na realidade as SQLs que faremos consulta ao banco. Observe na figura abaixo a criação de duas Query, uma consultando todos os perfis e outra consultando os perfis por código. Name: é o nome da query que você poderá chamar na sua classe PerfilTopLinkDAO. Query: o comando SQL a ser executado, no primeiro caso selecionar todos os perfis, já no segundo, selecionar por código.
Classe Perfil PerfilTopLinkDAO Agora cria a classe PerfilTopLinkDAO no pacote dao, observe que ela de estender DaoFactory pois esta tem os métodos de inserir, alterar e remover prontos e devemos implementar os métodos abstratos getlista e getobject, não se esqueça de passar o tipo para DaoFactory, como ela é genérica isso se torna obrigatório.
No método getlista chamo a query Perfil.all que foi definida em Perfil e mando retornar uma lista. O TopLink se encarrega de montar o objeto de forma correta. No método getobject crio uma query que receba a query mapeada na minha classe Perfil.byId logo seto o parâmetro Id e mando ele retornar um resultado simples, ou seja, o objeto que tenha aquele código. Novamente o TopLink se encarrega de montar os objetos. Faça o mesmo com as outras classes. Usuario UsuarioTopLinkDAO
Material MaterialTopLinkDAO
Solicitacao SolicitacaoTopLinkDAO Na classe ItemDeSolicitacao não será necessário fazer esta anotação, pois, só queremos pegar um item através da Solicitação não precisamos pegar todos os itens sem as solicitações. O que precisamos o TopLink se encarrega de fazer
Testando Para fazer o teste sugiro que crie uma classe com o método main e coloque o código a seguir, observe que o código está comentado.
Basta executar este código que o TopLink criará as tabelas e fará as devidas inserções. Sua IDE deverá exibir a seguinte saída:
Sendo que no final deve estar assim: Informando que tudo deu certo. Confira a interface de seu banco deverá mostrar as tabelas e você poderá visualizar os dados. Pronto seu mapeamento ORM com o FrameWork TopLink está rodando perfeitamente, agora mãos à obra e fazer a lógica do negócio. Que ninguém se engane, só se consegue a simplicidade através de muito trabalho. Clarice Lispector Sábio é o que aprende, realizado, o que ensina. Atila Raphael Contato: Atila Raphael atilaraphael@gmail.com