Crie entidades JPA ascendentes com o Rational Application Developer, o DB2 e o WebSphere Application Server

Usando o recurso Identity Value Generation do IBM DB2 e outras opções de design avançado

Aprenda a criar entidades Java Persistence Architecture (JPA) que sejam construídas a partir de tabelas relacionais pré-existentes, a usar os valores de chave primária gerados pelo banco de dados e que sejam partes de uma composição (ou agregação) de um ou mais beans de entidade JPA

Ali Manji, Software Developer, WebSphere Studio Application Developer Service, IBM Toronto Lab

photo of Ali ManjiAli Manji é um engenheiro de software no IBM Toronto Lab. Ele trabalha com as equipes do Rational Service e do Accelerated Value.


nível de autor Contribuidor do
        developerWorks

21/Set/2010

O foco deste artigo é a criação de entidades Java™ Persistence Architecture (JPA) com estas características:

  • Você as gera a partir de tabelas relacionais pré-existentes (ocasionalmente chamadas de abordagem "ascendente").
  • Elas usam valores de chave primária gerados pelo banco de dados para o atributo do ID.
  • Elas fazem parte de uma composição (ou agregação) de um ou mais beans de entidade JPA (por exemplo, relacionamentos um-para-um ou muitos-para-um).

Para aproveitar os valores de chave primária gerados pelo banco de dados para suas entidades JPA, você usará o recurso integrado e conveniente Identity Value Generation do IBM® DB2® .

Embora não seja o foco deste artigo, o aplicativo usará um Bean de Sessão Stateless Enterprise JavaBean™ (EJB) 3.0 e um servlet que use a especificação Servlet 2.5.

Antes de iniciar

Você usará as especificações™ Enterprise Edition (JEE) 5.0 para desenvolver o aplicativo. Para construir o aplicativo você usará:

  • IBM® Rational® Application Developer Versão 7.5.5
  • IBM® DB2® Server Edition versão 9.5.5 para Windows.
  • IBM® WebSphere® Application Server 7.0.0.7 (usando o WebSphere Test Environment disponível com o Rational Application Developer)

Nota:
Para replicar as etapas deste artigo, será necessário instalar o DB2 Server Edition v9.5.5 na mesma máquina Microsoft® Windows® como Rational Application Developer v7.5.5.

Existem alguns recursos que você usará na construção, incluindo um script para criar seu banco de dados DB2 inicial e alguns artefatos para seu aplicativo Java corporativo.

Extraia o arquivo resources568.zip em um local de sua escolha no sistema de arquivos. Ele deve conter dois arquivos: createMembersDB.sql e AcmeMembershipApplication.ear.


Trabalhando com o sistema de associação da ACME

A Figura 1 representa o banco de dados relacional físico para o subsistema de associação da Acme.

Figura 1. O modelo de dados de associação da Acme
Diagram that shows the five tables for the Membership database

Para receber serviços e benefícios da Acme Co., os clientes devem se tornar membros. Os clientes podem escolher entre as associações Single, Student ou Family (o campo membership_type na tabela Membership identifica o tipo de associação). As associações familiares oferecem serviços da Acme para casais e filhos menores de 18 anos. Para continuar membros em "situação regular", os clientes devem renovar suas associações anualmente.

Todas as associações terão, no máximo, um membro principal. O membro principal é responsável por manter a associação em situação regular e pelo pagamento de taxas de assinatura anual.

Além de ter um membro principal, uma associação familiar normalmente terá um ou mais dependentes. Existem dois tipos de dependentes na associação familiar: o cônjuge e os filhos menores de 18 anos.

Toda a correspondência entre a Acme Co. e seus membros ocorre exclusivamente por meio do membro principal. A Acme coleta o endereço e outras informações de contato do membro principal para todas as associações com esse propósito.

Importando o banco de dados de associação da Acme

O banco de dados de associação da Acme é uma parte importante de seu submódulo de associação. Você começará importando o esquema do banco de dados de associação da Acme para o DB2.

  1. No menu Iniciar do Windows, selecione Iniciar >Todos os Programas > IBM DB2 > DB2Copy1 (Default) > Command Line Tools > Command Editor.
  2. Na barra de menus Command Editor, clique em Selected > Open e procure onde você extraiu o arquivo createMembersDB.sql.
  3. Execute as instruções SQL e DDL escolhendo Selected > Execute na barra de menus da janela Command Editor do DB2.
  4. Após a execução bem-sucedida dos comandos SQL e DDL, conclua selecionando Command Editor > Exit.

Usando o recurso Identity Value Generation do DB2

Fazer com que o banco de dados gere valores para a chave primária de uma tabela (e, por extensão, qualquer valor de chave estrangeira para as tabelas relacionadas) elimina a carga do aplicativo de ter que fazê-lo. Ou seja, não ter que gerar valores de chave exclusivos para objetos persistentes no aplicativo permite que o foco permaneça na lógica de negócios principal e nas regras de negócios. Isso tem uma consequência positiva no aprimoramento das capacidades de manutenção e de leitura do aplicativo.

Os arquitetos de aplicativo e de dados principais da Acme desejam usar a função Identity Value Generation do DB2 para remover essa carga de lógica de negócios de vários aplicativos. Para aproveitar esse recurso, o JPA pode adiar a designação de um atributo do ID da entidade para o banco de dados relacional.

Configurando o recurso

Na seção anterior, você importou o banco de dados executando o script SQL fornecido. Entretanto, ainda é necessário configurar a chave primária da tabela MEMBERSHIP para usar o recurso Identity Value Generation do DB2.

  1. No Windows, selecione Iniciar >Todos os Programas> IBM DB2 > DB2Copy1 (Default) > General Administration Tools > Control Centre.
  2. Na área de janela de visualização em árvore esquerda do Control Center, expanda All Databases >pasta MEMBERS e selecione a pasta Tables .
  3. Na lista de tabelas correspondente exibida na visualização central da parte superior do Control Center, selecione a tabela Membership , clique com o botão direito do mouse e selecione Alter para ativar a janela de diálogo Alter Table (consulte a Figura 2).
Figura 2. Janela de diálogo Alter Table para alterar atributos da coluna
Alter Table – MEMBERHIP view
  1. Na janela de diálogo Alter Table, selecione a coluna ID e clique no botão Change , que ativará a janela de diálogo Change Column .
  2. Na janela de diálogo Change Column , clique na guia Value generation .
  3. Selecione o botão de opções Identity como mostra a Figura 3 e clique em OK.
  4. Clique em OK novamente para fechar o diálogo Alter Table e concluir a mudança na tabela MEMBERSHIP
Figura 3. Alterando a chave primária para usar a função Identity Value Generation
Change Column dialog window

A configuração da chave primária para usar a função Identity Value Generation tem algumas outras coisas interessantes a serem consideradas:

  • A seleção de Identity também impossibilita que a coluna apresente um valor nulo. Ou seja, esse campo sempre armazenará o valor gerado em cada linha.
  • Os campos Initial value e Increment (como mostra a Figura 3) podem configurar o valor da linha inicial e cada linha subsequente.

Nota:
Na Figura 3, você estava modificando a chave primária de uma tabela existente usando a janela de diálogoChange Column . Como alternativa, é possível definir a chave primária para usar o recurso Identity Value Generation no momento da definição da tabela e inclusão da coluna de chave primária.

Antes de gerar as entidades JPA, é necessário:

  1. Importar os inícios de um Projeto do Aplicativo Corporativo do JEE 5.0 que terá um Projeto EJB e um Projeto da Web
  2. Criar uma conexão ativa com o banco de dados de associação do DB2

Importando o aplicativo de associação para o Rational Application Developer

  1. Inicie o RAD 7.5.5 usando o local da área de trabalho de sua escolha. Iniciar > IBM Software Delivery Platform > IBM Rational Application Developer 7.5.
  2. Quando for solicitado um local da área de trabalho, é possível selecionar o local padrão fornecido ou inserir outro local conveniente.
  3. Se a janela Welcome aparecer, continue e feche-a.
  4. Importe o projeto EAR inicial no qual você está construindo.
    1. Na barra de menus selecione File > Import > Java EE > EAR File e clique em Next.
    2. Clique no botão Browse e navegue até o local em que você salvou o arquivo AcmeMembershipApplication.ear e selecione-o para a importação.
    3. Clique em Finish. Não há necessidade de continuar nas outras páginas do assistente de importação.

Após a importação com êxito, você terá um layout de projeto igual ao da Figura 4. Haverá três projetos: um projeto do aplicativo corporativo, um projeto de módulo da Web correspondente e um projeto de módulo EJB.

Serão exibidos vários erros na visualização Problems que você poderá ignorar com segurança até criar suas entidades JPA.

Figura 4. Projetos do aplicativo corporativo da Acme
Enterprise Explorer tab view shows 3 projects

O projeto EJB possui um EJB de sessão stateless que você usará para chamar as entidades JPA para criar novos membros e associações.

O projeto da Web possui um único servlet simples que pode ser facilmente executado no WebSphere Test Environment para chamar sua lógica de negócios.

Configurando a conexão de dados

Para que o Rational Application Developer tenha conhecimento do banco de dados MEMBERS que reside no seu servidor do DB2, é necessário estabelecer uma conexão de dados para ele com o Rational Application Developer.

  1. Alterne do Java EE Perspective para o Data Perspective. Selecione Window > Open Perspective > Other > Data
  2. Na visualização Data Source Explorer na pasta Database Connections , você deverá ver o banco de dados MEMBERS listado. Clique com o botão direito e selecione Properties.
  3. Na janela Properties, selecione a guia Driver Properties e, nessa tela, insira o nome de usuário e a senha da conta do DB2. Para conveniência, marque a caixa de opção Save password .
  4. Tente testar a conexão clicando no botão Test Connection . Clique em OK depois da exibição da mensagem Ping succeeded!
  5. Selecione novamente o banco de dados MEMBERS na pasta Database Connections, clique com o botão direito do mouse e selecione Connect.

Gerando as entidades JPA

Nesta seção, você gerará as entidades JPA nas tabelas de banco de dados MEMBERS que constituem o centro da lógica de negócios para o sistema de associação da Acme.

Primeiro, crie um projeto JPA para hospedar seus beans de entidade JPA:

  1. Alterne para a perspectiva JPA . Selecione File > New > JPA Project para abrir o assistente New JPA Project .
  2. Para o nome do Projeto, insira AcmeMembershipApplicationDomain e clique em Next.
  3. No menu suspenso Connection , selecione a conexão com o banco de dados MEMBERS .
  4. Selecione a caixa de opção Override default schema from connection e, em seguida, selecione o esquema do DB2 apropriado para seu banco de dados no menu suspenso Schema .
  5. Clique em Finish.

Agora que você criou um projeto JPA, poderá gerar suas entidades JPA:

  1. Clique com o botão direito do mouse no projeto JPA que você criou,AcmeMembershipApplicationDomain, e selecione JPA Tools > Add JPA Manager Beans > Generate Entities.
  2. A primeira página do assistente Generate Entities solicitará que você selecione a conexão com o banco de dados do DB2 e o esquema. Com base em como você criou seu projeto JPA, os padrões devem listar o banco de dados e o esquema corretos. Caso contrário, selecione a conexão e o esquema do banco de dados do DB2 para sua instância de banco de dados e clique no botão Next .
  3. Para o campo Package , insira org.acme.membership.domain.
  4. Marque a caixa de opção Synchronize Classes in persistence.xml .
  5. Clique no botão Select All para selecionar todas as tabelas listadas nessa página no assistente.
  6. Clique em Finish.

Dica:
Embora não seja óbvio, as entradas listadas na coluna Entity Name (indicadas por um círculo na Figura 5) são editáveis. Ou seja, é possível alterar os nomes de classe padrão das entidades JPA fornecidas. A figura 5 demonstra isso para duas das entidades renomeando Contactinfo para ContactInfo e Primarymember para PrimaryMember.

Figura 5. Tabelas de banco de dados relacional da qual gerar as entidades JPA
Shows two columns: Table, Entity Name

Sinta-se livre para procurar as entidades JPA geradas no projeto AcmeMembershipApplicationDomain.

Nota:
O conjunto de ferramentas no Rational Application Developer 7.5.5 para gerar os beans de entidade JPA depende muito da especificação JPA a fim de mapear o tipo de campo da coluna da tabela de banco de dados para um tipo adequado ao atributo correspondente na entidade JPA.

Agora que você possui entidades JPA, é possível corrigir a maioria dos erros em sua área de trabalho, todos com origem no projeto EJB que se refere às entidades JPA.

  1. Clique com o botão direito do mouse no projeto AcmeMembershipApplicationEJB na visualização Project Explorer e selecione Properties.
  2. Marque a caixa ao lado do projeto AcmeMembershipApplicationDomain , como mostra a Figura 6 e clique no botão OK .
Figura 6. Configurando as dependências do módulo Java EE para o projeto
Properties window: Java EE Module Dependencies view

Ajustando as entidades JPA

As entidades JPA geradas são apenas um ponto de partida. Elas exigem ajuste e aprimoramento antes de elaborá-las com a lógica de negócios adicional. Os ajustes são necessários para explorar as conveniências de idioma disponíveis e para garantir que as entidades reflitam o domínio de aplicativo e de negócio com mais exatidão.

Você fará esses ajustes para fazer com que as entidades JPA geradas:

  1. Especifiquem também que o atributo de chave exclusiva (marcado com a anotação @Id ) dependa de o banco de dados gerar seu valor.
  2. Aproveitem o tipo Java java.util.GregorianCalendar para capturar e manipular datas no tipo Java java.sql.Timestamp, que foi o tipo padrão escolhido quando as entidades JPA foram criadas.
  3. Substituam a interpretação do banco de dados do relacionamento de algumas das entidades para que sejam definidas como Um-para-Um e Muitos-para-Um. Isso não afetará a integridade referencial nem os relacionamentos de chave primária-estrangeira entre as tabelas no banco de dados de associação. O motivo de isso ser feito é o uso da lógica de aplicativo para refletir melhor suas regras de negócios e restrições existentes entre as entidades (isso representa abstrações dos objetos do mundo real e dos relacionamentos entre eles).

Especificando a geração automática de ID para entidades JPA

Você ajustará as entidades JPA para que os atributos do ID sejam especificados como aqueles que terão valores exclusivos gerados para eles por seu banco de dados, usando o esquema Identity Generation.

  1. Abra a classe PrimaryMember .
  2. Alterne para a perspectiva JPA e, na visualização JPA Structure (geralmente localizada na parte superior direita da perspectiva JPA), selecione o atributo id (consulte a Figura 7). Como alternativa, é possível selecionar o atributo do ID no editor Java.
Figura 7. Atributos da entidade JPA para a classe PrimaryMember
The JPA Structure tab view
  1. No editor JPA Details (geralmente localizado na parte inferior direita da perspectiva JPA), marque a caixa Primary Key Generation e selecione Identity no menu Strategy, como mostra a Figura 8.
Figura 8. Especificando o uso da estratégia de geração de chave primária de identidade
JPA Details tab view

Como mostra a Figura 9, observe que o atributo do ID agora possui uma anotação adicional associada a ele em razão das etapas anteriores.

Figura 9. Anotações adicionais para o atributo do ID, indicando a estratégia Primary Key Generation
GeneratedValue annotation highlighted
  1. Repita as etapas 1 a 3 para as outras entidades JPA nesse projeto (Address, ContactInfo, Dependent e Membership).

Alterando os tipos de padrão para atributos

Os tipos de dados que a Especificação JPA no conjunto de ferramentas no mapa do Rational Application Developer do DB2 para os atributos nas classes JPA funcionam muito bem na maioria das situações. De uma perspectiva da lógica de negócios e idioma, pode haver situações em que é mais conveniente o uso de outros tipos Java.

Um bom exemplo é o tipo java.sql.Timestamp , que o conjunto de ferramentas de JPA usa por padrão para o tipo de coluna TIMESTAMP do DB2. Os desenvolvedores e arquitetos de Java têm a opção de usar essa escolha padrão ou outros tipos compatíveis.

Os desenvolvedores e arquitetos do sistema de administração de associação da Acme escolheram java.util.GregorianCalendar e não o java.sql.Timestamp padrão. O uso de java.util.GregorianCalendar oferece vários métodos e operações que os desenvolvedores consideraram convenientes para seu aplicativo.

  1. Abra a classe PrimaryMember .
  2. No editor Java, refatore o atributo birthdate para criar o tipo java.util.GregorianCalendar em vez de java.sql.Timestamp. Para esta etapa, é necessário atualizar duas coisas:
    1. As classes importadas
    2. Os métodos get e set (getbirthdate, setbirthdate) para usar o java.util.gregoriancalendar
  3. Da perspectiva JPA, na visualização JPA Structure (geralmente localizada na parte superior direita da perspectiva JPA), selecione o atributo birthdate .
  4. No editor JPA Details (geralmente localizado na parte inferior direita da perspectiva JPA), no menu suspenso Temporal , selecione Timestamp, como mostra a Figura 10.
Figura 10. Configurando o atributo temporal para mapear como uma coluna de Timestamp
Temporal field set to Timestamp

Como mostra a Figura 11, o atributo birthdate agora possui uma anotação adicional associada a ele em razão das etapas anteriores.

Figura 11. Anotação para uma coluna de banco de dados relacional Timestamp
@Temporal (TIMESTAMP)
  1. Repita as etapas 1 a 3 para o atributo birthdate para a entidade JPA Dependent e também para os atributos lastrenewaldate e membersince para a entidade Membership .

Nota:
O conjunto de ferramentas do Rational Application Developer para JPA oferece visualizações e editores poderosos que reduzem a necessidade e o conhecimento necessário para codificar as anotações em suas entidades, como exigido pelas especificações EJB e JPA.

Ajuste as entidades JPA da Acme para relacionamentos unidirecionais um-para-um

Suponha que, para refletir as restrições das regras de negócios para a administração da associação da Acme, você gostaria de fazer alguns ajustes às suas entidades JPA:

  1. Reduza a cardinalidade (de muitos-para-um para um-para-um) para alguns dos relacionamentos
  2. Reduza a flexibilidade de navegação para alguns dos relacionamentos (de bidirecional para unidirecional)

Essas duas alterações tornarão o aplicativo mais seguro e menos propenso à quebra de qualquer uma das regras do aplicativo de associação da Acme.

Alterando a cardinalidade do relacionamento

  1. Abra a entidade JPA PrimaryMember .
  2. No editor Java, selecione o atributo address .
  3. Na visualização JPA Details , selecione o hyperlink many to one , como mostra a Figura 12.
Figura 12. Alterando a cardinalidade do relacionamento
Optional is unchecked, All is checked
  1. Na janela de diálogo Mapping Type Selection , selecione One to One, como mostra a Figura 13 e clique em OK.
Figura 13. Visualização do diálogo Mapping Type Selection
Arrow points to One to One in screen capture
  1. Na visualização JPA Details , desmarque a caixa de opção Optional e marque a caixa de opção All para as opções de Cascade, como mostra a Figura 12.

Na Figura 14, observe que a anotação que descreve a cardinalidade do relacionamento agora é um-para-um.

Figura 14. Anotação indicando o relacionamento de cardinalidade um-para-um
@OneToOne
  1. Repita as etapas 1 a 5 para estes atributos:
    • atributo contactInfo na entidade JPA PrimaryMember
    • atributo primarymember na entidade JPA Membership

Importante:
A etapa 5 não está relacionada à atividade geral de mudança na natureza do relacionamento das entidades JPA. Entretanto, ela é uma etapa necessária na criação de um objeto complexo persistente (por exemplo, um objeto composto de coletas e de uma agregação de outros objetos complexos).

  1. Para a entidade JPA Membership , selecione o atributo dependentCollection e, na visualização JPA Details , selecione All nas opções em Cascade.

Alterando as opções de navegação de relacionamento

O aplicativo de administração de associação da Acme não requer que os objetos Address tenham acesso ao objeto PrimaryMember. Para fornecer essa restrição de proteção aprimorada:

  1. Abra a entidade Address e remova o atributo primaryMemberCollection .
  2. Remova os métodos get e set correspondentes para o primaryMemberCollection.
  3. Para restringir outros relacionamentos por motivo semelhante, repita as etapas 1 e 2 para primarymemberCollection na entidade ContactInfo e para o atributo memberCollection na entidade PrimaryMember .

Por fim, depois destas alterações você deverá ver os avisos nas visualizações Problems que você pode eliminar removendo quaisquer importações não utilizadas. (Dica: A função Quick Fix é útil para fazer isso facilmente em uma etapa.)


Executando o aplicativo de associação da Acme

Agora você implementará o aplicativo de associação da Acme WebSphere Test Environment do Rational Application Developer. Você usará um servlet para executar a função de associação da Acme para criar uma nova associação familiar.

  1. Certifique-se de que você ainda esteja na perspectiva JPA e selecione o projeto AcmeMembershipApplicationDomain na visualização Project Explorer .
  2. Clique com o botão direito e selecione JPA Tools > Configure Project for JDBC Deployment.
  3. Na janela de diálogo "Set up connections for deployment", verifique se a conexão de dados que você criou anteriormente está selecionada no menu suspenso Connection .
  4. Certifique-se também de que as outras caixas de opção e os valores correspondam aos mostrados na Figura 15.
  5. Em seguida, clique em OK.
Figura 15. Janela de diálogo "Set up connections for deployment"
MEMBERS selected for Connection field
  1. Alterne da perspectiva JPA novamente para a perspectiva Java EE .
  2. Na visualização Enterprise Explorer , expanda AcmeMembershipApplicationWeb > Servlets.
  3. Clique com o botão direito do mouse em CreateMembershipServlet e selecione Run As > Run on Server.
  4. Se o assistente de diálogo Run On Server aparecer, marque a caixa de opção Always use this server when running this project (Figura 16) antes de clicar em Finish.
Figura 16. Diálogo Run on Server
Always use this server… checked
  1. Depois que o servidor WebSphere Test Environment tiver sido iniciado, ele chamará seu servlet e abrirá uma página da Web, indicando que a criação de uma nova associação foi realizada com êxito. Será solicitado que você consulte as tabelas de banco de dados para obter os valores a fim de confirmar a criação.

Resumo

Para este artigo, nós usamos o conjunto de ferramentas do Rational Application Developer para gerar e customizar rapidamente as entidades JPA de um banco de dados do DB2 com estas características:

  • Tabelas que usam o recurso Identity Value Generation do DB2 para criar valores exclusivos de chaves primárias
  • Um conjunto incomum de relacionamentos entre as tabelas

No ambiente Rational Application Developer, você aumentou sua produtividade usando visualizações e editores que permitiram padronizar suas entidades JPA, evitando que você realize codificação permanente das anotações necessárias.

Por fim, você executou seu aplicativo usando o WebSphere Application Server convenientemente integrado ao WebSphere Test Environment do Rational Application.


Agradecimentos

O autor agradece a Mike Reid pela revisão completa e cuidadosa deste artigo.


Download

DescriçãoNomeTamanho
Resources for this articleresources568.zip15KB

Recursos

Aprender

Obter produtos e tecnologias

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Rational, WebSphere
ArticleID=525249
ArticleTitle=Crie entidades JPA ascendentes com o Rational Application Developer, o DB2 e o WebSphere Application Server
publish-date=09212010