Gerando um aplicativo CRUD do JavaServer Faces a partir de um banco de dados
Neste tutorial, você usa o NetBeans IDE para gerar e implantar uma aplicação Web que exibe dados a partir de um banco de dados. O tutorial demonstra como gerar uma aplicação Web com a funcionalidade CRUD (criar, ler, atualizar e excluir) que usa a API de persistência Java (JPA) para gerenciar a transação do banco de dados. No tutorial, você primeiro cria classes de entidade baseadas em tabelas em um banco de dados e, em seguida, cria páginas JavaServer Faces (JSF) a partir de classes de entidade usando o assistente para Páginas JSF de classes de entidade.
O assistente para Páginas JSF de classes de entidade permite que você gere páginas JSF de forma rápida e fácil para trabalhar com um banco de dados baseado nas classes de entidade do seu projeto. O assistente também lhe dá a opção de ativar a funcionalidade Ajax nas páginas JSF geradas. O código gerado pelo assistente possui os seguintes recursos:
O código é fácil de manter e personalizar.
Manipula todos os tipos de relação, IDs gerados e não-gerados, e IDs incorporados, incluindo os campos ID incorporados que correspondem às colunas de chave estrangeira
Campos ID incorporados são mostrados como somente leitura onde apropriado
Inclui verificações obrigatórios para evitar violações de coluna não-nula e verificações órfãs para evitar violações de coluna não-nula em entidades relacionadas. O assistente incluirá elementos de anotação nullable ou optional nas classes de entidade.
Inclui verificações para checar se a entidade atual está correta a fim de evitar erros, se um usuário desviar do fluxo de página normal (por exemplo, ao trabalhar em várias abas do navegador)
Evita código por propriedade em determinados arquivos caso você precise mais tarde modificar o esquema do seu banco de dados
Os campos podem ser removidos facilmente das JSPs geradas para simplificar a personalização
Manipulação elegante de situações quando um usuário tenta operar em uma entidade que foi excluída por outro usuário ou tenta criar uma entidade que já existe.
As páginas podem ser estilizadas facilmente
Além de gerar páginas JSF para você, o assistente para Páginas JSF de classes de entidade incorpora a funcionalidade do assistente para Classes de controlador JPA de classes de entidade. Se você deseja criar classes de controlador JPA para classes de entidade, mas não deseja que as páginas JSF sejam geradas, use o assistente para Classes de controlador JPA de classes de entidade em vez do assistente para Páginas JSF de classes de entidade.
Observação. O servidor da aplicação GlassFish é incluído no download do NetBeans.
Criando o banco de dados
Este tutorial usa um banco de dados de agência de consultoria chamado consult. O banco de dados não está incluído quando você instala o IDE, portanto, você precisa primeiro criar o banco de dados para seguir este tutorial.
O banco de dados consult foi criado para demonstrar o escopo do suporte do IDE para manipular uma variedade de estruturas de banco de dados. Portanto, o banco de dados não é um exemplo de design de banco de dados recomendado. Em vez disso, ele tenta incorporar muitos recursos relevantes encontrados em um design de banco de dados. Por exemplo, o banco de dados consult contém todos os tipos de relacionamento possíveis, chaves primárias compostas e muitos tipos de dados diferentes. Consulte as tabelas para obter uma visão geral mais detalhada da estrutura do banco de dados.
Observação. Este tutorial usa o servidor de banco de dados JavaDB, mas você também pode completar o tutorial usando o servidor de banco de dados MySQL. Para criar o banco de dados em MySQL, baixe e extraia o arquivo mysql-consult.zip. Para obter mais informações sobre a configuração do IDE para trabalhar com MySQL, consulte o tutorial Conectando a um banco de dados MySQL.
Quando extrair o arquivo, você verá dois scripts SQL: derby_create_consult.sql e derby_insert_data_consult.sql.
Na janela Serviços, expanda o nó Bancos de dados, clique com o botão direito do mouse no nó JavaDB nó e escolha Iniciar servidor.
Clique com o botão direito do mouse no nó Java DB e escolha Criar banco de dados.
Digite consult como o Nome do banco de dados, Nome de usuário e Senha na caixa de diálogo Criar Java DB. Clique em OK.
Um novo nó aparece sob o nó Bancos de dados (jdbc:derby://localhost:1527/consult [consult on CONSULT]).
Clique com o botão direito do mouse no novo nó e escolha Conectar.
Escolha Arquivo > Abrir arquivo no menu principal e navegue para o arquivo extraído derby_create_consult.sql. Clique em Abrir.
O arquivo se abre automaticamente no editor SQL.
Verifique se o banco de dados consult está selecionado na lista suspensa Conexão na barra de ferramentas do editor SQL e clique no botão Executar SQL.
Quando você clica em Executar SQL, a saída seguinte aparece na janela Saída.
Visualizando a estrutura do banco de dados
Para ver se as tabelas foram criadas corretamente, expanda o nó Tabelas sob o nó da conexão do banco de dados. Você pode expandir um nó da tabela para ver as colunas, índices e quaisquer chaves estrangeiras da tabela. Você pode clicar com o botão direito do mouse em uma coluna e escolher Propriedades para visualizar informações adicionais sobre a coluna.
Se você não vir quaisquer tabelas sob o nó Tabelas, clique com o botão direito do mouse no nó Tabelas e escolha Atualizar.
Se você observar a estrutura do banco de dados consult, verá que o banco de dados contém tabelas que possuem uma variedade de relacionamentos e vários tipos de campo. Ao criar classes de entidade a partir de um banco de dados, o IDE gera automaticamente o código apropriado para os vários tipos de campo.
A tabela seguinte descreve as tabelas encontradas no banco de dados consult.
Tabela de banco de dados
Descrição
Recursos de design
CLIENT
Um cliente da agência de consultoria
Chave primária composta, não-gerada (cujos campos não constituem uma chave estrangeira)
CONSULTANT
Um funcionário da agência de consultoria que os clientes podem contratar
Inclui um campo de retomada do tipo LONG VARCHAR
CONSULTANT_STATUS
O status de um consultor na agência de consultoria (por exemplo, Ativo e Inativo são status possíveis)
Chave primária não-gerada do tipo CHAR
RECRUITER
Um funcionário da agência de consultoria responsável por conectar clientes e consultores
PROJECT
Um projeto que um cliente possui com os consultores da agência de consultoria
Chave primária composta, não-gerada que inclui dois campos constituindo uma chave estrangeira para a tabela CLIENT
BILLABLE
Um conjunto de horas trabalhadas por um consultor em um projeto, o qual a agência de consultoria cobra do cliente relevante
Inclui um campo de artefato do tipo CLOB
ADDRESS
O endereço de cobrança de um cliente
PROJECT_CONSULTANT
Tabela unida indicando quais consultores estão atribuídos no momento a determinados projetos
Faz referência cruzada entre PROJECT e CONSULTANT, a primeira possui uma chave primária composta
O banco de dados consult inclui uma variedade de relacionamentos. Ao criar classes de entidade a partir de um banco de dados, o IDE gera automaticamente o código apropriado para os relacionamentos da tabela, adicionando as anotações apropriadas aos campos nas classes de entidade. A tabela seguinte descreve os relacionamentos de tabela encontrados no banco de dados consult. (Os relacionamentos inversos não são mostrados.)
Tabela de banco de dados
Tabela relacionada
Informações sobre relacionamento
Descrição
CLIENT
RECRUITER
nulo um para um com edição manual; nulo um para muitos caso não seja editado
CLIENT possui muitos RECRUITERs e RECRUITER possui zero ou um CLIENT
CLIENT
ADDRESS
não-nulo um para um
CLIENT possui um ADDRESS e ADDRESS possui zero ou um CLIENT
CLIENT
PROJECT
não-nulo um para muitos; em uma entidade de projeto, o valor do campo do cliente é parte da chave primária do projeto
CLIENT possui (pode ser atribuído a) muitos PROJECTS e PROJECT possui um CLIENT
CONSULTANT
BILLABLE
não nulo um para muitos
CONSULTANT possui muitos BILLABLEs e BILLABLE possui um CONSULTANT
CONSULTANT
CONSULTANT_STATUS
não-nulo um para muitos
CONSULTANT possui um CONSULTANT_STATUS e CONSULTANT_STATUS possui (pode ser atribuído a) muitos CONSULTANTS.
CONSULTANT
RECRUITER
nulo um para muitos
CONSULTANT possui zero ou um RECRUITER e RECRUITER possui muitos CONSULTANTs
BILLABLE
PROJECT
não-nulo um para muitos
BILLABLE possui um PROJECT e PROJECT possui muitos BILLABLES
PROJECT_CONSULTANT
CONSULTANT
não-nulo um para muitos
PROJECT_CONSULTANT possui um CONSULTANT e COSULTANT possui (pode ser atribuído a) muitos PROJECT_CONSULTANTs
PROJECT_CONSULTANT
PROJECT
um para muitos
PROJECT_CONSULTANT possui um PROJECT e PROJECT possui muitos PROJECT_CONSULTANTs
Agora que o banco de dados está criado, você pode criar a aplicação Web e usar o assistente para Classes de entidade do banco de dados com base nas tabelas do banco de dados.
Criando o projeto de aplicação Web
Neste exercício, você cria um projeto Web e adiciona o framework JavaServer Faces ao projeto. Quando você criar o projeto, irá selecionar JavaServer Faces no painel Frameworks do assistente para Novo projeto.
Escolha Arquivo > Novo projeto (Ctrl-Shift-N).
Na categoria Java Web, selecione Aplicação Web. Clique em Próximo.
Digite ConsultingAgency para o nome do projeto e defina a localização do projeto.
Desmarque a opção Usar pasta dedicada, se ela estiver selecionada.
Para este tutorial, não há motivo para copiar as bibliotecas do projeto para uma pasta dedicada porque você não precisará compartilhar bibliotecas com outros usuários.
Clique em Próximo.
Defina o servidor como GlassFish e defina a versão de Java EE Java EE 5. Clique em Próximo.
Marque a caixa de verificação JavaServer Faces no painel Frameworks. Clique em Terminar.
Observação: Ao selecionar o framework, selecione o framework JavaServer Faces, NÃO Visual Web JavaServer Faces.
Quando você clicar em Terminar, o IDE criará o projeto de aplicação Web e abrirá welcomeJSF.jsp no editor. Você pode fechar welcomeJSF.jsp porque não precisará editar esse arquivo.
Gerando as classes de entidade do banco de dados
Depois que você criar o banco de dados e a conexão do banco de dados for registrada no IDE, use o assistente para Classes de entidade do banco de dados para gerar rapidamente as classes de entidade com base nas tabelas do banco de dados. O IDE pode gerar classes de entidade para cada tabela que você selecionar, e também pode gerar quaisquer classes de entidade necessárias para tabelas relacionadas.
Na janela Projetos, clique com o botão direito do mouse no ConsultingAgency e escolha Novo > Classes de entidade do banco de dados.
Selecione Nova fonte de dados na lista suspensa Fonte de dados para abrir a caixa de diálogo Criar fonte de dados.
Digite jdbc/consult como o Nome JNDI e selecione jdbc:derby://localhost:1527/consult [consult on CONSULT] como a Conexão do banco de dados. Clique em OK para fechar a caixa de diálogo e retornar ao assistente.
As tabelas no banco de dados consult aparecem na caixa de listagem Tabelas disponíveis.
Clique em Adicionar tudo no assistente. Clique em Próximo.
Digite jpa.entities como o Pacote. Verifique se a caixa de verificação para gerar as consultas nomeadas está marcada.
Clique em Criar unidade de persistência para abrir a caixa de diálogo Criar unidade de persistência. Clique em Criar na caixa de diálogo para criar a unidade de persistência e retornar ao assistente.
Você pode manter os valores padrão para a unidade de persistência.
Clique em Próximo.
Mantenha os valores padrão na página Opções de mapeamento do assistente. Clique em Terminar.
Você pode usar a página Opções de mapeamento do assistente, se quiser personalizar mais as anotações ou o tipo de coleção nas entidades geradas. Para este tutorial, os valores padrão são suficientes.
Ao usar o assistente para criar classes de entidade de um banco de dados, o IDE examina os relacionamentos entre as tabelas. Na janela Projetos, se você expandir o nó Pacote de códigos-fonte jpa.entities, poderá ver que o IDE gerou uma classe de entidade para cada tabela exceto para a tabela PROJECT_CONSULTANT. O IDE não criou uma classe de entidade para PROJECT_CONSULTANT porque a tabela é uma tabela unidade.
O IDE também gerou duas classes adicionais para as tabelas com chaves primárias compostas: CLIENT e PROJECT. As classes de chave primária dessas tabelas (ClientPK.java e ProjectPK.java) possuem PK anexado ao nome.
Se você observar o código gerado para as classes de entidade, poderá ver que o assistente adicionou anotações @GeneratedValue aos campos ID e elementos da anotação @Basic(optional = "false") a alguns dos campos das classes de entidade. Com base nos elementos da anotação @Basic(optional = "false"), o assistente para Páginas JSF de classes de entidade pode gerar o código que inclui verificações para evitar violações da coluna não nulo para esses campos.
Editando as classes de entidade
Se desejar, você agora pode editar as classes de entidade geradas. Neste exercício, você modificará as implementações do método toString nas classes de entidade. Na classes Client e Recruiter você também modificará as anotações para alterar o relacionamento entre clientes e recrutadores de um para muitos para um para um. Como já existe um relacionamento nulo um para muitos entre recrutadores e consultores, para fins demonstrativos neste tutorial, você estabelecerá um relacionamento nulo um para um entre clientes e recrutadores.
Observação. Esta seção do tutorial é opcional e você não precisa fazer quaisquer alterações nas classes de entidade antes de gerar as páginas JSF com o assistente para Páginas JSF de classes de entidade.
Editando Address.java
Abra a classe de entidade Address faça as alterações seguintes.
Modifique a instrução de retorno do método toString para retornar o endereço completo.
return line1 + ", " + line2 + ", " + city + ", " + region + ", " + country + ", " + postalCode;
Você pode usar o auto-completar de código do IDE para ajudá-lo a adicionar os campos.
Corrija suas importações, se necessário, e salve suas alterações.
Editando Billable.java
Abra a classe de entidade Billable e faça as seguintes alterações.
Modifique a instrução de retorno do método toString para retornar à descrição, id do consultor e projeto:
Corrija suas importações, se necessário, e salve suas alterações.
Editando Client.java
Modifique a anotação @OneToMany no campo recruiterCollection para tornar o relacionamento um para um e alterar o campo de uma coleção para Recruiter recruiter.
Modifique os getters e setters de Collection<Recruiter> recruiterCollection de acordo com as alterações no nome do campo. O novo getter e setter terá a seguinte aparência:
public Recruiter getRecruiter() {
return recruiter;
}
public void setRecruiter(Recruiter recruiter) {
this.recruiter = recruiter;
}
Talvez seja mais simples excluir o getter e setter de Collection<Recruiter> recruiterCollection e gerar um novo getter e setter para Recruiter recruiter usando a caixa de diálogo Inserir código. Para criar um novo getter e setter, clique com o botão direito do mouse no código-fonte e escolha Inserir código (Alt-Insert) e selecione Getter e Setter. Selecione recruiter na caixa de diálogo Gerar getter e setter e clique em Gerar.
Modifique a instrução de retorno do método toString para retornar String.valueOf(clientPK).
public String toString() {
return String.valueOf(clientPK);
}
Corrija suas importações, se necessário, e salve suas alterações.
Editando ClientPK.java
Modifique a instrução de retorno do método toString para retornar o nome do cliente e o número do departamento.
Corrija suas importações, se necessário, e salve suas alterações.
Editando Recruiter.java
Modifique a anotação @ManyToOne no campo client para tornar o relacionamento um para um.
@OneToOne
private Client client;
Modifique a instrução de retorno do método toString para retornar o email.
public String toString() {
return email;
}
Corrija suas importações, se necessário, e salve suas alterações.
Gerando páginas JSF de classes de entidade
Agora que as classes de entidade estão criadas, você pode criar a interface Web para exibir e modificar os dados. Você usará o assistente para Páginas JSF de classes de entidade para gerar páginas JavaServer Faces. O código gerado pelo assistente inclui verificações baseadas nas anotações das classes de entidade. O assistente também lhe dá a opção de ativar a funcionalidade Ajax no aplicativo, estendendo a tecnologia JavaServer Faces com a tecnologia Dynamic Faces.
Para cada classe de entidade o assistente gera o seguinte:
uma classe de controlador JPA
uma classe de controlador JSF
uma classe de conversor JSF
um diretório contendo quatro arquivos JSP (Detail.jsp, Edit.jsp, List.jsp, New.jsp)
elementos de bean gerenciado, elementos de conversor e regras de navegação para a classe em faces-config.xml
O assistente também gera classes seguintes usadas pelas classes do controlador:
classes de exceção usadas pelos controladores JPA
classes de utilitário usadas pelos controladores JSF
Para gerar as páginas JSF:
Clique com o botão direito do mouse no nó do projeto na janela Projetos e escolha Novo > Páginas JSF de classes de entidade para abrir o assistente para Novas páginas JSF de classes de entidade.
O painel Tabelas disponíveis do assistente lista as sete classes de entidade do projeto. O assistente não lista as classes incorporadas (ClientPK.java e ProjectPK.java)
Clique em Adicionar tudo para mover todas as classes para o painel Classes de entidade selecionadas do assistente. Clique em Próximo.
Digite jpa.controllers para o pacote do controlador JPA.
Digite jsf para o pacote de classes JSF.
Selecione Habilitar com Ajax páginas geradas.
Clique em Terminar.
Quando você clica em Terminar, o IDE cria as classes do controlador JPA da classe de entidade no pacote jpa.controllers e o conversor JSF e as classes do controlador JSF no pacote jsf. Cada classe do controlador manipula as operações da classe de entidade correspondente, incluindo a criação, edição e destruição de instâncias da classe de entidade por meio da API de persistência Java. Cada classe do conversor JSF implementa a interface javax.faces.convert.Converter definida pelo JavaServer Faces e converte as instâncias da classe de entidade correspondente para objetos String e vice-versa. Cada classe do controlador JSF é específica para a JSP gerada correspondente e inclui o código que chama os métodos nas classes do controlador JPA e demonstra quais exceções a serem interceptadas.
Em geral, ao modificar seu aplicativo, você desejará modificar a lógica do controlador nas classes do controlador JSF e usar o código gerado como um exemplo.
Se expandir o nó Páginas da Web, você poderá ver que o IDE gerou uma pasta de cada uma das classes de entidade. Cada pasta contém os arquivos Detail.jsp, Edit.jsp, List.jsp e New.jsp. O IDE também modificou welcomeJSF.jsp , inserindo links em cada uma das páginas List.jsp.
Se você expandir o nó Pacotes de códigos-fonte, poderá ver as classes de controlador, de conversor, de exceção e de utilitário que o assistente gerou.
Se expandir o nó Arquivos de configuração e abrir faces-config.xml no editor XML, você poderá ver que o IDE inseriu o bean gerenciado e os elementos de conversor de cada controlador e classes de conversor. O IDE também inseriu um elemento de regra de navegação de cada JSP, indicando o resultado lógico que faz com que o aplicativo navegue para esse JSP.
Sobre a ativação do Ajax no aplicativo
O painel final do assistente para Páginas JSF de classes de entidade lhe dá a opção de selecionar Ativar com Ajax páginas geradas para ativar a funcionalidade Ajax no aplicativo através da extensão Dynamic Faces para o framework JSF. O assistente adiciona as bibliotecas de extensões JSF obrigatórias ao projeto e configura o descritor de deployment do aplicativo para ativar o ciclo de vida do Ajax. Para saber mais sobre as extensões JSF do Dynamic Faces, consulte o site de extensões de tecnologia do JavaServer Faces.
Se você selecionar a opção, o assistente realiza as seguintes ações.
Adiciona bibliotecas de extensões JSF ao projeto (jsf-extensions-common, jsf-extensions-dynamic-faces, commons-logging e shale-remoting) que são necessárias para o uso da tecnologia Dynamic Faces no projeto.
Modifica web.xml para configurar o FacesServlet para usar o ciclo de vida do Ajax, adicionando uma entrada do parâmetro de inicialização javax.faces.LIFECYCLE_ID e configurando o valor para com.sun.faces.lifecycle.PARTIAL.
Gera o arquivo de fragmento JSP AjaxScripts.jspf no diretório WEB-INF/jspf. AjaxScripts.jspf renderiza arquivos JavaScript contidos nas bibliotecas do Dynamic Faces.
O aplicativo contém um arquivo JavaScript jsfcrud.js no diretório Páginas da Web. O arquivo jsfcrud.js verifica se o Dynamic Faces está ativado, ao checar se os arquivos JavaScript do Dynamic Faces foram renderizados. Se o Dynamic Faces estiver ativado, o formulário será configurado para enviar solicitações do Ajax.
Depois de ativar o Ajax no aplicativo com extensões do Dynamic Faces, você pode modificar o aplicativo para adicionar mais funcionalidade fornecida pelas extensões do Dynamic Faces.
Gerando classes de controlador JPA a partir de classes de entidade
Na aplicação Web gerada, os métodos do controlador JPA são acessados pelos métodos da classe do controlador JSF. Quando você usa o assistente para Páginas JSF de classes de entidade, o IDE gera automaticamente as classes do controlador JPA de cada uma das entidades selecionadas. Mas o uso de classes do controlador JPA não está restrito a aplicações Web JSF. Você pode usar as classes do controlador JPA em outros aplicativos que usem a API de persistência Java (por exemplo, em aplicativos de área de trabalho) para trabalhar com classes de entidade e gerenciar a persistência da entidade.
O assistente para Classes do controlador JPA de classes de entidade permite que você crie facilmente as classes do controlador JPA nos projetos. Para criar as classes do controlador JPA, abra o assistente para Novo arquivo e escolha Classes do controlador JPA de classes de entidade na categoria Persistência. No assistente, você especifica as classes de entidade para as quais deseja criar as classes do controlador JPA e determina onde deseja que o IDE crie os arquivos. O assistente também cria automaticamente as classes de exceção usadas pelas classes do controlador JPA.
Depois de gerar os controladores JPA, você pode acessar os métodos do controlador a partir de outros arquivos. Se você atualizar o esquema do seu banco de dados, poderá executar novamente o assistente para Classes de entidade do banco de dados e o assistente para Controladores JPA de classes de entidade para atualizar as classes. Se desejar, depois de criar as classes do controlador JPA, você poderá executar o assistente para Páginas JSF de classes de entidade e especificar o pacote das classes do controlador JPA existentes. Nesse caso, as classes existentes do controlador JPA serão reutilizadas em vez de geradas novamente.
Adicionando dados ao banco de dados
Agora que terminou de criar o aplicativo, você pode implantá-lo e executá-lo. O banco de dados Consulting Agency que você criou está vazio. Você precisa adicionar os dados ao banco de dados, adicionando dados por meio da interface da Web ou executando um script SQL. Depois de adicionar os dados, você verá como os relacionamentos entre as tabelas funcionam.
Adicionando dados com um script SQL
Caso não deseje adicionar os dados por meio de formulários Web, você pode executar o script derby_insert_data_consult.sql incluído em derby-consult.zip.
Abra derby_insert_data_consult.sql, escolhendo Arquivo > Abrir arquivo no menu principal.
O arquivo se abre automaticamente no editor SQL.
Verifique se o banco de dados consult está selecionado na lista suspensa Conexão na barra de ferramentas do editor SQL e clique no botão Executar SQL na barra de ferramentas.
Você pode ver o resultado da execução do script na janela Saída.
Observação. Se você estiver usando o servidor de banco de dados MySQL, abra o arquivo mysql_insert_data_consult.sql incluído no mysql-consult.zip.
Adicionando dados com a interface Web
Você pode adicionar o banco de dados, iniciando o aplicativo em seu navegador e adicionando os dados através de formulários Web.
Clique em Executar projeto principal na barra de ferramentas principal.
O IDE salva todos os arquivos alterados, reconstrói e reimplanta o aplicativo no servidor. Seu navegador da Web padrão se abre no endereço local http://localhost:8080/ConsultingAgency/.
Clique em Mostrar todos os itens do endereço e clique em Novo endereço.
Adicione os dados seguintes no formulário Novo endereço.
Campo
Valor
Line1
100 Data Street
Line2
Suite 432
City
San Francisco
Region
California
Country
USA
PostalCode
94103
Clique em Criar.
Clique em Índice para voltar à página de índice.
Clique em Mostrar todos os itens do cliente e clique em Novo cliente.
Adicione os dados seguintes no formulário Novo cliente.
Campo
Valor
ClientDepartmentNumber
2000
Client Name
Big Data Corp.
Contact Email
Contact Password
accounting
Selecione Palm Spring Street na lista suspensa BillingAddress.
Clique em Criar e em Índice para retornar para a página de índice.
Clique em Mostrar todos os itens do projeto e clique em Novo projeto.
Adicione os dados seguintes no formulário Novo projeto.
Campo
Valor
ProjectName
Secret Project
ContactEmail
ContactPassword
project.manager
Clique em Criar e em Índice para retornar para a página de índice.
Clique em Mostrar todos os itens de status do consultor e em Status do novo consultor.
Adicione os dados seguintes no formulário Novo status do consultor.
Campo
Valor
StatusId
A
Description
Active
Clique em Criar e em Índice para retornar para a página de índice.
Clique em Mostrar todos os itens do consultor e em Novo consultor.
Adicione os dados seguintes no formulário Novo consultor.
Campo
Valor
Email
Password
janet.smart
HourlyRate
80
BillableHourlyRate
120
Selecione Secret Project no campo ProjectCollection.
Selecione A, Active na lista suspensa StatusId.
Clique em Criar e em Índice para retornar para a página de índice.
Clique em Mostrar todos os itens faturáveis e clique em Novo faturável.
Adicione os dados seguintes no formulário Novo faturável.
Campo
Valor
StartDate
2008-10-13 00:00:00.0
EndDate
2008-10-17 00:00:00.0
Hours
40
HourlyRate
80
BillableHourlyRate
120
Description
begin gathering requirements
ConsultantId
Project
Secret Project
Clique em Criar e em Novo faturável.
Adicione os dados seguintes no formulário Novo faturável.
Dessa vez você digitará finish gathering requirements no campo Description.
Campo
Valor
StartDate
2008-10-20 00:00:00.0
EndDate
2008-10-24 00:00:00.0
Hours
40
HourlyRate
80
BillableHourlyRate
120
Description
finish gathering requirements
ConsultantId
Project
Secret Project
Clique em Criar para voltar à página de índice.
Clique em mostrar todos os itens do recrutador e em Novo recrutador.
Adicione os dados seguintes no formulário Novo recrutador.
Campo
Valor
Email
Password
bob
Selecione na lista ConsultantCollection.
Observação. Deixe a lista suspensa Cliente vazia.
Clique em Criar e em Índice para retornar para a página de índice.
Depois de adicionar os dados ao banco de dados, você pode navegar pelas páginas geradas para ver os relacionamentos entre as tabelas.
Explorando a funcionalidade no código gerado
Depois de preencher o banco de dados, você poderá ver exemplos de como o código gerado pelo assistente se baseia nas propriedades dos campos de banco de dados.
Campos de chave primária somente leitura
Se um campo no banco de dados for uma chave primária, o assistente irá gerar o código para evitar que o usuário edite o campo nos formulários gerados. Os exemplos seguintes ilustram as instâncias em que o campo de chave primária é somente leitura.
Se você navegar para a página Novo cliente, poderá ver que o campo ProjectCollection é somente leitura. Se o aplicativo permitisse uma tentativa de alterar o cliente associado a um projeto existente, a operação falharia porque o cliente associado a um projeto é parte da chave primária do projeto. Você pode verificar isso no script SQL, examinando a chave primária consult_project_pk e a chave estrangeira consult_project_fk_client_name.
Se você navegar para Editando a página do projeto, poderá ver que o campo Client é somente leitura. O campo é somente leitura porque o cliente associado a um projeto é parte da chave primária do projeto.
Verificações de erro gerado
O código gerado pode verificar se a ação de um usuário resultará em um erro. Por exemplo, se uma tabela possui uma coluna que não pode ser nula, o código poderá verificar se uma ação resultará que esse campo seja nulo e exibirá uma mensagem de erro. Depois de preencher o banco de dados, você poderá ver exemplos das verificações geradas, tentando editar os dados nos formulários. Você receberá uma mensagem de erro, se tentar fazer as seguintes ações.
Criar outro item Projeto, especificando novamente Secret como ProjectName, e preenchendo os campos ContactEmail e Client.
Aparece uma mensagem de erro indicando que o item já existe.
Criar outro item Endereço, mas deixar todos os campos em branco.
Aparecem mensagens de erro indicando os campos obrigatórios.
Edite o item Consultor "", cancelando a seleção de "finish gathering requirements" na lista BillableCollection.
Aparece uma mensagem de erro indicando que o item Faturável que você desmarcou deve ser mantido porque seu campo consultantId não pode ser nulo.
Destruir o item Projeto "Secret Project, Big Data Corp., Dept. 2000".
Aparece uma mensagem de erro indicando que o item Projeto não pode ser destruído porque nos itens Faturável associados o campo project não pode ser nulo.
Destruir um item que já tenha sido destruído por outro usuário.
Aparece uma mensagem de erro indicando que o item não existe mais e ele não é mais exibido na lista.
Você pode fazer isso caso use dois navegadores e navegue para a mesma página (por exemplo, a página Listando itens faturáveis) em cada navegador. Destruir um dos itens Faturável em um dos navegadores e tentar destruir o mesmo item no outro navegador.
Para obter mais informações sobre o uso do NetBeans IDE para desenvolver aplicações Web usando Persistência Java e JavaServer Faces, consulte os seguintes recursos: