Páginas

quarta-feira, 4 de abril de 2012

JPA/Hibernate e Sequences: script para associar sequences e colunas

Você sabe como os sitemas de bancos de dados Oracle fazem para associar sequences e colunas?
Bom, infelizmente ele não faz.

O Oracle Database ainda não possui a propriedade de coluna "AUTO_INCREMENT" tal como do MySQL ou SERIAL do PostreSQL.

Uma opção seria fazer uso de triggers, para colocar o valor crescente nas tabelas de identificadores tal como exemplificado pelo Tim Hall em seu blog.

Mas e se o projeto já esta em andamento a alguns anos?
E se ele for construido em Java com uso de algum framework de persistência, tais como JPA e Hibernate (xodó dos programadores)?

Bom, depois de me debater durante umas 2 a 3 horas procurando por um parser de anotações Java/JPA especifico para sequences resolvi escrever meu próprio parser para tornar a minha vida mais fácil, e talvez a sua também.

O script "HbtParse_SeqToDB.pl" foi escrito em Perl e esta disponível no Google code, no projeto que criei recentemente chamado DB-Handy-Code.


Descrição: O script primeiramente se conecta ao banco de dados e cria no esquema do usuário fornecido uma tabela auxiliar chamada AUX_SEQUENCE_TAB_COL (caso ela não exista). Esta tabela possui 3 colunas (sequence_name, table_name e column_name) onde o nome da sequencia é uma chave primária e não pode ser repetida.
Após isto ela efetua uma varredura (do tipo 'find') de toda a árvore de diretórios a partir do <source directory> especificado buscando por arquivos ".java". Em cada arquivo ele efetua um parse por anotações específicas e caso cosiga efetuar a associação entre "Sequencia, Tabela e Coluna" ele insere esta associação na tabela auxiliar AUX_SEQUENCE_TAB_COL. Caso a sequence já exista na tabela auxiliar ele apenas imprime um "warning" na saída padrão, informando o nome do arquivo.

Após ter os dados das associações na tabela auxiliar é possível efetuar atividades de manutenção, tais como o reset dos valores das sequences para o valor máximo das colunas. Escrevi a algum tempo o código de uma stored procedure para tal, disponível aqui.


Limitações da versão 0.1a do HbtParse_SeqToDB.pl:

  1. Ela atualmente só reconhece anotações JPA em código fonte ".java", mas tenho intenção de extende-lo para elementos de XML no futuro
  2. É necessário que a anotação  @Column  esteja após a anotação @Id  e antes da declaração do atributo/método da entidade, para que seja possível fazer a associação
  3. Atualmente  só reconhece 1 sequence em cada arquivo fonte, e este arquivo pode conter apenas 1 entidade e 1 atributo identificador (o que não deixa de ser uma boa prática de programação Java)
  4. Atualmente suporta apenas banco de dados Oracle
  5. É necessário Perl v5.10 ou superior
  6. São necessários os seguintes módulos Perl
    • File::Find::Rule
    • Getopt::Long
    • DBI
    • DBD::Oracle
Como usar:
HbtParse_SeqToDB.pl -d <src dir> -B <src db> -U <db user> [-P <db pwd> -t <parser type> -h]
O script possui uma opção "-h" que exibe um help com a sintaxe.
Exemplo de uso:
[henchen@obelix ~]$ perl HbtParse_SeqToDB.pl -d /src-java -B dbi:Oracle://localhost:1521/ORCL -U scott -P tiger 



Nenhum comentário:

Postar um comentário