Hibernate em Sistemas Desktop  XML
Índice dos Fóruns » Ferramentas, Frameworks e Utilitários
Autor Mensagem
flaviomreis
Debugger
[Avatar]
Membro desde: 04/07/2006 09:20:35
Mensagens: 56
Offline

Boa tarde galera!

Estou com um baita problema. Desenvolvo um sistema para gerenciamento de um estúdio fotográfico utilizando swing e hibernate e banco de dados mysql. Tenho a aplicação instalada em dois computadores, o grande problema é que as alterações feitas em um computador não são acessadas pelo outro até que este encerre e inicie novamente a aplicação, ou seja, o sistema de cache do hibernate não "vê" estas alterações feitas em outro computador, o que é lógico, pois seria esperar demais que adivinhasse atualizações. Tentei desabilitar o sistema de caches do hibernate com o seguinte código:



Realmente não sei o que fazer para resolver este problema, se implemento uma comunicação entre as aplicações para que se avisem quando fizerem alterações e dar um flush (ou sei lá o que) no hibernate para ele elimitar os objetos em cache.

Espero que tenha sido claro em meu problema. Agradeço a atenção de todos.

Flávio Menezes dos Reis
Bacharel em Sistemas de Informação
Terra de Areia - RS
[MSN] [ICQ]
Arcadex
JavaBaby
[Avatar]

Membro desde: 04/08/2004 15:20:37
Mensagens: 86
Localização: Vitória / Es
Offline

Nunca ouvi falar de um problema parecido.
Quer dizer que se por exemplo, você atualizar o cadastro de um cliente. Você troca o endereço e tel dele em um computador. Aí, logo depois você consulta os dados do cliente no outro computador e aparece os dados antigos ??

É esse mesmo seu problema ?
[WWW]
xgucax
JavaBaby
[Avatar]

Membro desde: 07/10/2006 09:06:36
Mensagens: 92
Offline

Pelo que eu entendi, você não está utilizando o conceito de Transação do próprio Hibernate, ou vc está?
Experimente após cada ação, efeutar um commitTransaction().
Desse modo a base deve se alterada com os novos dados

Boa sorte

Embrace and extend this _|_
<hr>
[MSN]
velo
GUJ Ranger
[Avatar]

Membro desde: 19/02/2004 18:23:55
Mensagens: 797
Localização: Jaraguá do Sul - SC
Offline

Pergunto....

Vc está comitando a transação?
Fechando a session?
Eu lembro de já ter visto algo assim.... tenta dar um session.flush() pra ver se resolve.

VELO

Use o melhor:

Linux para servidores
Macintosh para gráficos
Palm para mobilidade
Windows para jogar paciência

SCJP 5
[Email] [MSN] [ICQ]
Arcadex
JavaBaby
[Avatar]

Membro desde: 04/08/2004 15:20:37
Mensagens: 86
Localização: Vitória / Es
Offline

Mas se depois que ele reestarta a aplicação ele vê as alterações, parece n ser problema de controle de transação.... ou está com o autocommit = true ??? Nuh
[WWW]
xgucax
JavaBaby
[Avatar]

Membro desde: 07/10/2006 09:06:36
Mensagens: 92
Offline

Provavelmente.
Mas será que o Hibernate não provê esse mecanismo? Commitar a transação quando o coletor tentar apanhar o objeto da sessão?

Embrace and extend this _|_
<hr>
[MSN]
Guerr@
Virtual Machine Man
[Avatar]

Membro desde: 03/12/2006 10:32:50
Mensagens: 520
Offline

Talvez o problema não seja com o hibernate mas com a arquitetura utilizada. Sugiro criar uma camada de negócios remota que seja acessada por ambas aplicações...

Eduardo Guerra - "É Java na ponta do dedo!"
Desenvolvedor de Frameworks - Pesquisador
Editor Chefe - Revista MundoJ
Professor - Instituto Tecnológico de Aeronáutica
Me siga no Twiter!!! http://twitter.com/emguerra
[Email]
flaviomreis
Debugger
[Avatar]
Membro desde: 04/07/2006 09:20:35
Mensagens: 56
Offline

Olá galera... vamos aos códigos!

Tenho usado esta classe auxiliar para o hibernate:


Tenho o seguinte DAO para clientes:


As linhas session.flush() acrescentei-as a pouco para testar, mas não funcionou... Creio que o hibernate esteja mantendo as instancias já lidas em cache o que faz com que novas leituras (ClienteDAO.list(), por exemplo) não apareçam na outra aplicação aberta. E isto ocorre mesmo se rodar duas instancias de aplicação na mesma máquina.

Já to pensando seriamente em fazer uma camada de acesso remoto como indicou o Guerr@, mas o problema é que sou iniciante em Java e sei que tomarei uma surra tremendar...

Ouço falar de RMI e outras coisas referentes a objetos remotos... Acho que a solução seria algo neste sentido (isto claro se minha solução atual não funcionar mesmo).

Obrigado a todos.

Flávio Menezes dos Reis
Bacharel em Sistemas de Informação
Terra de Areia - RS
[MSN] [ICQ]
mister__m
Virtual Machine Man
[Avatar]

Membro desde: 18/03/2005 16:13:17
Mensagens: 736
Offline

flaviomreis wrote:Já to pensando seriamente em fazer uma camada de acesso remoto como indicou o Guerr@, mas o problema é que sou iniciante em Java e sei que tomarei uma surra tremendar...

Ouço falar de RMI e outras coisas referentes a objetos remotos... Acho que a solução seria algo neste sentido (isto claro se minha solução atual não funcionar mesmo).


Embora eu acredite que seu problema imediato possa ser resolvido de outras formas, centralizar a camada de negócios num servidor de aplicação provavelmente é a melhor estratégia pro seu caso.

O genesis foi criado pra resolver justamente esse tipo de problema: criar aplicações desktop com backend enterprise. Ele torna tudo isso bem fácil e elimina a necessidade de você ter que conhecer RMI e afins. Na verdade, ele permite até mesmo a transição de um modo de execução local pra remoto de forma transparente, sem modificar nenhuma linha do seu código. Vale a pena conferir.

Michael Nascimento Santos, aka Mister M

Summa Technologies do Brasil - http://www.summa-tech.com/
genesis: Uma nova forma de desenvolver aplicações - https://genesis.dev.java.net/
ThinNB: Suporte a Thinlet no NetBeans - https://thinnb.dev.java.net/
Líder da JSR-310 - Date and Time API
Expert Group Member das JSRs 207 (PD4J), 250 (Common Annotations), 270 (Java 2 SE 6.0), 296 (Swing Framework) e 303 (Bean Validation)
SouJava: Fortalecendo a comunidade Java brasileira - https://soujava.dev.java.net/ https://www.soujava.org.br/
JSR Community @ java.net - http://community.java.net/jsr
Blogs - http://blog.michaelnascimento.com.br/ http://today.java.net/pub/au/80
Twitter - @mr__m
[WWW]
flaviomreis
Debugger
[Avatar]
Membro desde: 04/07/2006 09:20:35
Mensagens: 56
Offline

mister__m, desculpe a ignorância, ainda estou lendo a documentação do genesis, mas tu não terias algum exemplo simples de como utilizar o genesis para resolver meu problema do hibernate para que eu possa estudar/adaptar? Obrigado

Flávio Menezes dos Reis
Bacharel em Sistemas de Informação
Terra de Areia - RS
[MSN] [ICQ]
flaviomreis
Debugger
[Avatar]
Membro desde: 04/07/2006 09:20:35
Mensagens: 56
Offline

Dei uma olhada superficial no genesis, mas me pareceu um pouco confuso, além de demonstrar-se ser um canhão para meu pequeno problema... Acho que vou partir para obtenção de objetos remotamente, utilizando uma aplicação só para servidor dados às minha aplicações finais.... Bora estudar objetos remotos...

Flávio Menezes dos Reis
Bacharel em Sistemas de Informação
Terra de Areia - RS
[MSN] [ICQ]
flaviomreis
Debugger
[Avatar]
Membro desde: 04/07/2006 09:20:35
Mensagens: 56
Offline

Bah... nada é fácil na vida ehehehe (que bom!)... Bom, existe como eu eliminar totalmente os caches do hibernate? Gostaria detestar isto antes de partir para outra solução, porque pelo que to vendo implementar um servidor de dados com RMI não é tão simples assim. Valeu!

Flávio Menezes dos Reis
Bacharel em Sistemas de Informação
Terra de Areia - RS
[MSN] [ICQ]
mister__m
Virtual Machine Man
[Avatar]

Membro desde: 18/03/2005 16:13:17
Mensagens: 736
Offline

Pelo que vi pelo seu código, o problema é que esse closeSession() não é chamado e você usa sempre a mesma Session. Tente resolver isso.

Michael Nascimento Santos, aka Mister M

Summa Technologies do Brasil - http://www.summa-tech.com/
genesis: Uma nova forma de desenvolver aplicações - https://genesis.dev.java.net/
ThinNB: Suporte a Thinlet no NetBeans - https://thinnb.dev.java.net/
Líder da JSR-310 - Date and Time API
Expert Group Member das JSRs 207 (PD4J), 250 (Common Annotations), 270 (Java 2 SE 6.0), 296 (Swing Framework) e 303 (Bean Validation)
SouJava: Fortalecendo a comunidade Java brasileira - https://soujava.dev.java.net/ https://www.soujava.org.br/
JSR Community @ java.net - http://community.java.net/jsr
Blogs - http://blog.michaelnascimento.com.br/ http://today.java.net/pub/au/80
Twitter - @mr__m
[WWW]
xgucax
JavaBaby
[Avatar]

Membro desde: 07/10/2006 09:06:36
Mensagens: 92
Offline

que tal tentar executar o session.flush() e hibernateUtil.closeSession() após o save e update?
Não sei se foi seu caso, mas tem gente que pega essa classe no Hibernate In Action e simplesmente tenta usá-la na marra, sem saber o que está acontecendo a cada linha.
Tente realmente descarregar a sessão e posteriormente fechá-la. Teoricamente o hibernate é OBRIGADO a salvar os objetos no banco

Boa sorte

Embrace and extend this _|_
<hr>
[MSN]
flaviomreis
Debugger
[Avatar]
Membro desde: 04/07/2006 09:20:35
Mensagens: 56
Offline

Valeu mister__m e xgucax... alterei o método save e update conforme orientam e alterei-os:


Com ambos métodos chamados, a seguinte exceção ocorre ao tentar salvar a mesma instância duas vezes (clicar no botão de salvar duas vezes sem alterar nada, o que faz chamar o método ClienteDAO.update()...


A linha 32 de ClienteDAO.java é uma chamada à session.update(cliente).

Se retiro a chamada ao método closeSession() tudo funciona perfeitamente na aplicação, mas a outra instância da aplicação (digamos aplicação2) continua não "enxergando" as mudança, até que ela seja fechada e executada novamente(a aplicação2).... assim, creio que o problema não seja flush ou closeSession(), pois a sessão de uma aplicação, nada tem a ver com a sessão de outra... e se, como anteriormente, não chamando flush e closeSession(), ao simples reiniciar da aplicação2 fazia com que as mudanças aparececem, creio que seja um problema de cache.

Como rmi é um troço bem mais complicado do que eu via a princípio, já to pensando até em alterar meu DAO para utilizar JDBC ao invés de hibernate... sinceramente não sei o que fazer.

Obrigado gente!

Flávio Menezes dos Reis
Bacharel em Sistemas de Informação
Terra de Areia - RS
[MSN] [ICQ]
 
Índice dos Fóruns » Ferramentas, Frameworks e Utilitários
Ir para:   
Powered by JForum 2.1.8 © JForum Team