Desenvolver uma aplicação JavaEE utilizando um banco de dados FireBird já existente

06/09/2010

Gostaria de uma ajuda, preciso desenvolver uma aplicação Java EE 6, utilizando um banco de dados FireBird que já esta funcionando com uma aplicação em Delphi . . 

Gostaria de saber como posso começar uma aplicação Java EE 6, utilizando este BD (criar a conexão, utilizar as tabelas já existentes para criar as classes de entidade, e se posso usar o arquivo security.fdb para fazer a autentificação dos usuários).

Desde já agradeço a atenção...
Davi Lima

 
Davi Lima

Davi Lima

Curtidas 0

Respostas

Henrique Weissmann

Henrique Weissmann

06/09/2010

Davi, qual o plano geral para a sua aplicação. Qual a sua plataforma de execução inicial? Desktop, web, webservices? Dependendo do caso, nem precisaremos trabalhar com a plataforma JEE, visto que a SE já irá te atender perfeitamente. Aguardamos seu retorno.
GOSTEI 0
Davi Lima

Davi Lima

06/09/2010

Bem, hoje a aplicação funciona em Desktop, em um aplicativo que fiz em Delphi, mas preciso mudar para Web, a ideia é desenvolver o mesmo aplicativo que está funcionando Desktop, em uma aplicativo WEB.

Pensei em usar Java EE 6 e BD MySQL, mas como o banco de dados esta pronto gostaria de reaproveitar o que uso aqui (FireBird). . . . mas sou novato em Java, estou começando a aprender JSF agora, até estou seguindo um modelo de aplicativo da Java Magazine 80,81,82 para aprender um pouco mais... por isso preciso de ajuda...

 
GOSTEI 0
Henrique Weissmann

Henrique Weissmann

06/09/2010

Bem Davi, a primeira coisa que você precisa fazer portanto é trabalhar na sua camada de modelo. Como você, vim do Delphi também e sei o quão difícil pode ser esta mudança de ambiente.

Pra começar portanto, o primeiro passo é tentar ignorar ao máximo possível o modo como trabalha com Delphi. Por um momento finja que interface gráfica é algo que não existe (incluindo componentes não visuais, como os de conexão do Delphi, principalmente) e passe a pensar apenas na camada de modelo.

Para a camada de modelo, visto que quer trabalhar com JEE, a primeira coisa que precisa conhecer é o JPA (Java Persistence API). Esta é, como o próprio nome já diz, a camada responsável por mapear os atributos das suas classes aos campos presentes na base de dados.

Eu sei que é muita sigla para quem está iniciando na tecnologia, porém recomendo que, antes de começar a lidar com o JPA, tenha o mínimo de conhecimento a respeito da camada em cima do qual o JPA é construído. No caso, estou falando do JDBC. A DevMedia possui um curso introdutório sobre esta tecnologia, que pode ser acessado neste link: https://www.devmedia.com.br/cursos/java/190-Introducao-ao-JDBC.html

Não precisa ser um expert em JDBC: apenas o conhecimento básico para que a compreensão do JPA se torne mais clara. Bom: conhecendo o JDBC, já é hora de partir pro JPA. Novamente, há um curso da DevMedia que vai te ajudar a clarear as idéias: https://www.devmedia.com.br/cursos/java/192-Desenvolvendo-uma-aplicacao-completa-com-JPA.html

O fundamental, inicialmente Davi, é que trabalhemos apenas com a camada de modelo para posteriormente escolhermos qual a melhor solução de interface do seu sistema. EJB, Web, Desktop, etc. Como você verá, muito provávelmente o EJB se mostrará para você como um "canhão para matar formigas". Digo isto porque em 90% dos casos nos quais trabalhei, um bom modelo desenvolvido na plataforma Java SE mesmo, somado a uma interface web (usando JSF ou algum outro framework web) ou swing dá conta (e muito bem) do recado.

Como extra: visto que você irá trabalhar com Firebird, é importante ter o driver de acesso, que pode ser baixado neste link: http://www.firebirdsql.org/index.php?op=files&id=jaybird
GOSTEI 0
Davi Lima

Davi Lima

06/09/2010

Olá Henrique; Acabei sumindo um tempo por motivos de saúde. Mas agora estou bem! Bem andei estudando e vi muita coisa no site, mas o que mais me ajudou foi um livro do Edson Gonçalves (Desenvolvendo Aplicações Web com NetBeans IDE 6). Aprendi um pouco sopre Persistência, e acho que já consigo criar meus EJBs… Bem fiz uns testes aqui, e consegui fazer um exemplo do site do NetBeans, usando Java EE 6 e EJB 3.1, confesso que é um pouco diferente do Java EE5 que vi no livro do Edson, acaba que agora as coisas são muito mais camufladas…rsrsrs… mas acho que realmente ficou mais fácil programar… não pense que sou preguiçoso, é que o tempo é curto e preciso ser ágil. Os meus projetos usando NetBeans com MySql estão funcionado… tudo redondo… mas quando vou fazer um projeto usando o FireBird, adivinha…. da erro… e um erro que não consigo descobrir como arrumar. Consegui fazer a conexão com a base de dados na aba serviços do NetBeans, usando o drive jaybird-pool-2.1.6.jar jaybird-2.1.6.jar jaybird-full-2.1.6.jar Até criei as classes de domínio do meu Banco de dados, e nossa como é fácil….. Mas o erró aparece quando mando implantar o ejb…. O erro é relativo ao : Caused by: java.util.regex.PatternSyntaxException: Unknown character property name near index 67 resources.jdbc-connection-pool.jdbc_firebirdsql_127_0_0_1_3050_C_\ProjetoPCC\Dados\pcc_GDB_C_sysdbaPool. pelo menos é essa mensagem que aparece pra mim. Acho que o erro é do tipo de recurso do GlassFish Server 3, em relação ao Bando de Dados Fire Bird Por favor, me ajude, estou ficando desesperado…. Um abraço.
GOSTEI 0
Henrique Weissmann

Henrique Weissmann

06/09/2010

Oi Davi,

não é que você seja preguiçoso, é que todo mundo tinha preguiça de trabalhar com o JEE antes do 5, que era MUITO burocrático. :D Realmente, você tem razão, as coisas melhoraram demais de lá pra cá, não é mesmo?

Fico também feliz que sua saúde esteja recobrada. Que Deus mantenha!

Bom: observei algumas coisas aqui.

1. Você não precisa dos arquivos jaybird-pool-2.1.6.jar e jaybird-2.1.6.ja. O conteúdo destes já está presente no jaybird-full-2.1.6.jar. Sendo assim, pode removê-lo do seu projeto, mesmo que seja por via das dúvidas, pois a mesma classe repetida no classpath pode gerar problemas imprevistos ok?

2. O erro que você está tendo. Vejo algumas opções pra ela.
    a ) a remoção dos arquivos acima já resolveu seu problema
    b ) será que não tem nenhum caractere acentuado na sua configuração? Ocorrem situações nas quais a instrução encoding do xml é uma, mas o encoding do arquivo em si é outro. Verifique isto.

Caused by: java.util.regex.PatternSyntaxException: Unknown character property name near index 67
    c) Como está configurada a conexão com o banco de dados? Tem como você me passar estas configurações por aqui? Assim a gente pode dar uma olhada e ver o que da pra fazer ok?

Peço desculpas pela minha demora também, que não mais se repetirá.

Grande abraço e aguardo seu retorno.
GOSTEI 0
Devmedia

Devmedia

06/09/2010

Davi,
por falta de retorno estamos encerrando o chamado. Caso vc ainda tenha dúvidas sobre o assunto tratado, é só postar uma nova mensagem e o consultor voltará a lhe atender.
GOSTEI 0
Davi Lima

Davi Lima

06/09/2010

Olá; O projeto tomou um novo rumo, e migrei todo base de dados para MySQl Estou tendo dificuldades para montar algumas regras especificas de negocio. Tenho que registrar um código em uma tabela do banco de dados, como pk, mas esse código não é auto incremento. O campo onde será armazenado esse valor que será tratado como pk é um varchar(15), juntamente com um código de filal. Ex.: codconta codfilial 1000000000000 1 1000000001000 1 1000000000000 2 1000000000000 3 1000000001001 1 Não tenho idéia de como fazer esse controle para criar o codconta e gerencia-lo. Já desenvolvi praticamente todas as partes de cadastro, só resta terminar essa parte, e a parte de controle de login. atenciosamente; Davi Lima
GOSTEI 0
Henrique Weissmann

Henrique Weissmann

06/09/2010

Oi Davi, segue então uma sugestão de algoritmo para você ok? 1. Obtenha o código da filial 2. No banco de dados, busque o número de registros relacionados a esta filial. 3. Concatene o resultado: Supondo que seja primeiro o código da filial (que terá um número x de digitos) e o restante o número do registro (n - x digitos) (supondo n = número de digitos) Você pode usar a classe java.text.DecimalFormat para isto, tal como no exemplo abaixo: DecimalFormat formatoDecimalFilial = new DecimalFormat(000); // supondo 3 digitos para a filial DecimalFormat formatoRegistro = new DecimalFormat(000000000000); // supondo 12 digitos para o registro String codigo = formatoDecimalFilial.format(codigoFilial) + formatoRegistro.format(numRegistrosDaFilial + 1); Isto já te ajuda?
GOSTEI 0
Henrique Weissmann

Henrique Weissmann

06/09/2010

Oi Davi, segue então uma sugestão de algoritmo para você ok?
1. Obtenha o código da filial
2. No banco de dados, busque o número de registros relacionados a esta filial.

3. Concatene o resultado: Supondo que seja primeiro o código da filial (que terá um número x de digitos) e o restante o número do registro (n - x digitos) (supondo n = número de digitos)

Você pode usar a classe java.text.DecimalFormat para isto, tal como no exemplo abaixo:
DecimalFormat formatoDecimalFilial = new DecimalFormat(000); // supondo 3 digitos para a filial

DecimalFormat formatoRegistro = new DecimalFormat(000000000000); // supondo 12 digitos para o registro

String codigo = formatoDecimalFilial.format(codigoFilial) + formatoRegistro.format(numRegistrosDaFilial + 1);

Isto já te ajuda?

Nota: editei o chamado para torná-lo mais legível.
GOSTEI 0
Davi Lima

Davi Lima

06/09/2010

Olá... valeu pela ajuda... agora estou com mais um grande problema... primeiro: não estou conseguindo fazer o gerenciador de login funcionar segundo: na tela de login o usuario vai colocar seu login e senha (claro), mas também vai escolher a filial que ele vai logar. Tendo isso ficando pronto e funcionando tenho que armazenar o dado de login e de filial, para ser usado em todas as movimentações do usuário no sistema. No banco de dados todas as tabelas já tem o campo para armazenar o usuário que criou determinado registro, o usuário que fez a alteração a data e hora da criação do registro e a data e hora da modificação, ou seja um controle para auditoria básico... mas como em um aplicativo web posso recuperar os valores par serem inseridos juntamente com um novo registro que o usuário fizer. Tentei fazer o login usando uma técnica que vi na java magazine 81 (Java EE 6 na pratica), mas infelizmente não deu certo. Sinceramente eu gostei muito do exemplo da revista, e gostaria muito de fazer um igual.
GOSTEI 0
Davi Lima

Davi Lima

06/09/2010

javax.el.PropertyNotFoundException: /index.xhtml @23,122 value="#{loginController.nomeBanco}": Target Unreachable, identifier 'loginController' resolved to null isso é o que esta retornando quando faço o login
GOSTEI 0
Henrique Weissmann

Henrique Weissmann

06/09/2010

Davi, vamos aos pontos.

Você postou:
>> javax.el.PropertyNotFoundException: /index.xhtml @23,122 value="#> {loginController.nomeBanco}": Target Unreachable, identifier 'loginController' resolved to null isso é o que esta retornando quando faço o login
 
Verifique no seu arquivo faces-config.xml se há um managed bean cadastrado com o nome loginController. Normalmente este erro acontece quando escrevemos errado o nome do managed-bean.

Sobre a auditoria, tenho uma sugestão. Há um problema com o modelo que você está descrevendo, que pode ser resumido em uma pergunta: como auditar o histórico de alterações de um registro?

Pelo que vocẽ me descreveu, em cada tabela há um campo contendo o valor que identifica o usuário responsável pela criação do registro. Sendo assim, vamos imaginar uma tabela chamada filial, na qual há os seguintes campos:

Id (chave primária da tabela)
Nome (o nome da filial)
idUsuario (o identificador do usuário que alterou o registro).

No primeiro momento, em que o registro é inserido no banco de dados, você saberá quem inseriu o registro. Mas suponha que no futuro algum outro usuário edite este registro. Ao ser editado, o campo idUsuario terá de ser alterado para dizer quem foi o usuário que fez esta alteração, apagando o valor anterior e, consequentemente, o histórico de alterações.

Minha sugestão para você é a seguinte: crie uma tabela auxiliar, com a estrutura abaixo:

idRegistro -> O id do registro que está sendo auditado
idUsuario  -> O id do usuário que está executando a ação
data (datetime) -> a hora emq ue o registro foi alterado

A cada alteração do registro, seja ela inclusão ou edição, vocẽ incluirá um novo registro nesta tabela. Consequentemente, teŕa o histórico completo de alteração dos registros no seu banco de dados. Para saber quando o registro foi incluido, é fácil: basta buscar a menor data na tabela cujo id do registro seja o que você está buscando.

O que me diz?


GOSTEI 0
Davi Lima

Davi Lima

06/09/2010

Olá; esse erro eu consegui resolver, estava faltando o arquivo bens.xml.... sem ele não tem como trabalhar com CDI pelo que entendi... bem refiz o projeto e marquei para o NetBeans Criar esse arquivo em Habilitar injeção de contextos e dependências... Bem... passando por isso consegui fazer algumas coisas... mas estou vendo mais um problema aqui... se não conseguir resolver até essa madrugada vou mandar para vc dar uma olhada... inté+
GOSTEI 0
Davi Lima

Davi Lima

06/09/2010

Exception Description: Predeployment of PersistenceUnit [SisContabil2-ejbPU] failed. Internal Exception: Exception [EclipseLink-7155] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.ValidationException Exception Description: The type [class Unidade] for the attribute [unidade] on the entity class [class siscontabil2.dominio.Lanca] is not a valid type for a serialized mapping. The attribute type must implement the Serializable interface. Olá... O problema agora esta sendo esse erro.. o que devo fazer para arrumar isso? se for possível, me passe seu e-mail que lhe mando uma cópia do projeto... desde já agradeço; Davi Lima ps.: meu email é: luxdavi@gmail.com
GOSTEI 0
Henrique Weissmann

Henrique Weissmann

06/09/2010

Oi Davi, basta implementar a interface java.io.Serializable na sua classe Lanca, tal como no exemplo abaixo:
public class Lanca implements java.io.Serializable
GOSTEI 0
Devmedia

Devmedia

06/09/2010

Davi
por falta de retorno estamos encerrando o chamado. Caso tenha dúvidas sobre o assunto aqui tratado, basta postar novamente e o consultor voltará a lhe atender.
GOSTEI 0
Davi Lima

Davi Lima

06/09/2010

já terminei o projeto... valeu... inté+
GOSTEI 0
POSTAR