Como sincronizar o Hibernate com meu banco de dados

Olá pessoal, fiz o seguinte teste.

1º - Entrei na minha aplicação, rodei o Hibernate e então fui navegando nos registros…
2º - Entrei no console e mudei um determinado registro através de linha do comando. (ou seja, nao rodei pelo hibernate)
3º - Quando fui navegando e passei por ele, o Hibernate ainda estava com o registro antigo.

Gostaria de saber como faz para sincronizar isso, para que ocorra nao esse problema.

Abraços

Ué… nunca vi isso acontecer…
e olha que ja fiz uns scrips rodarem no servidor de tempos
em tempos para alterar registros ‘na unha’…

nunca vi isso.
será que vc fez a consulta novamente no banco qndo navegou nos registros?

E tambem tem que ver se voce deu commit nas alterações que voce fez na base…

a sua APP é web?

na sua camada dao que seleciona o dado do banco, se você der um sysout no registro, aparece o valor correto ou o antigo?

Era isso… Veja o antes e o depois…

 public static List findAll(Object classe) {
	    Session em = HibernateUtil.getSessionFactory().openSession();
            Query query = em.createQuery("Select a from " + classe.getClass().getName() + " a");
            List<Object> lista = query.list();
            em.clear();
            em.close();
            return lista;
 }
 public static List findAll(Object classe) {
	  Session em = HibernateUtil.getSessionFactory().openSession();
          Transaction trans = em.beginTransaction();
          trans.commit();
          Query query = em.createQuery("Select a from " + classe.getClass().getName() + " a");
          List<Object> lista = query.list();
          em.clear();
          em.close();
          return lista;
 }

Obrigado pela ajuda amigo

Já aproveitando o tópico, o Hibernate meu demora 14 segundos para carregar… a média de tempo é essa? O db tem em torno de umas 30 tabelas…

Abraços

Descobri também a seguinte propriedade do Hibernate:

Com isso, eu nao precisei daquele commit que postei acima…

Abraços

[quote=Gleidson Henrique]Descobri também a seguinte propriedade do Hibernate:

Com isso, eu nao precisei daquele commit que postei acima…

Abraços[/quote]

Mas utilizar autocommit não é recomendado nem na própria documentação do Hibernate (http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/).

O ideal é você fazer o controle transacional num serviço, não no DAO. Até pq uma transação pode envolver o uso de diferentes DAOs. Pra facilitar isto, procure por Spring ou JTA.

[quote=wagnerfrancisco][quote=Gleidson Henrique]Descobri também a seguinte propriedade do Hibernate:

Com isso, eu nao precisei daquele commit que postei acima…

Abraços[/quote]

Mas utilizar autocommit não é recomendado nem na própria documentação do Hibernate (http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/).

O ideal é você fazer o controle transacional num serviço, não no DAO. Até pq uma transação pode envolver o uso de diferentes DAOs. Pra facilitar isto, procure por Spring ou JTA.[/quote]

Estou programando em Desktop amigo…

Sobre o que você falou, então o melhor é trabalhar da maneira que tinha feito antes? Dando o commit na transação?

Deixa eu te perguntar outra coisa… Isso que fiz funcionou somente para os botoes ‘Primeiro registro’ e ‘Ultimo registro’ visto que quando vou nele, puxo toda a lista de informações para um List e dai vou percorrendo a lista… Caso eu atualizar um registro no db na unha, ele não estará nessa minha List…

Como vocês geralmente fazem para esses botões ‘Primeiro Registro’, ‘Próximo registro’, ‘Voltar registro’, ‘Último Registro’… ?

Abraços

Dá pra usar Spring em aplicações Desktop e é simples. Mas o ponto aqui é fazer o controle transacional, com ou sem Spring.

[quote=Gleidson Henrique]
Sobre o que você falou, então o melhor é trabalhar da maneira que tinha feito antes? Dando o commit na transação?[/quote]

Sem algum framework que faça isto para você, tem que fazer isto na mão mesmo, dar commit, rollback, etc. No modo auto-commit, cada declaração SQL que você faz é automaticamente “comitada”. Mas como eu disse, o próprio Hibernate não aconselha isto. Neste link está melhor explicado:

https://community.jboss.org/wiki/SessionsAndTransactions?_sscc=t

[quote=Gleidson Henrique]
Deixa eu te perguntar outra coisa… Isso que fiz funcionou somente para os botoes ‘Primeiro registro’ e ‘Ultimo registro’ visto que quando vou nele, puxo toda a lista de informações para um List e dai vou percorrendo a lista… Caso eu atualizar um registro no db na unha, ele não estará nessa minha List…

Como vocês geralmente fazem para esses botões ‘Primeiro Registro’, ‘Próximo registro’, ‘Voltar registro’, ‘Último Registro’… ?

Abraços[/quote]

Mas você está executando a consulta novamente? Se você faz uma busca, carrega os dados em memória, altera os dados no banco, o Hibernate não vai automaticamente enxergar isto. É preciso repetir a consulta.

Estava pensando, guardar uma lista de informações ocupa muita memoria, estou pensando em fazer um esquema para guardar uma lista apenas com os IDs e a cada vez que for clicado para ir ao proximo registro, ele vai ao db e puxa as informações somente daquele registro…

Obrigado pela ajuda amigo… Qualquer coisa, volto a gritar aqui… rsrs

Abraços

[quote=Gleidson Henrique][quote=wagnerfrancisco]
Mas você está executando a consulta novamente? Se você faz uma busca, carrega os dados em memória, altera os dados no banco, o Hibernate não vai automaticamente enxergar isto. É preciso repetir a consulta.
[/quote]

Estava pensando, guardar uma lista de informações ocupa muita memoria, estou pensando em fazer um esquema para guardar uma lista apenas com os IDs e a cada vez que for clicado para ir ao proximo registro, ele vai ao db e puxa as informações somente daquele registro…

Obrigado pela ajuda amigo… Qualquer coisa, volto a gritar aqui… rsrs

Abraços

[/quote]

Não sei exatamente qual o cenário que você tem, mas não vejo muito sentido nesta sua abordagem. Você não vai utilizar os objetos que traz do banco? Depois de utilizar, você descarta. A princípio não vejo pq armazenar os ids. Numa aplicação desktop, por exemplo, você possivelmente vai exibir uma coleção de dados em um combo ou uma tabela. Quando você não precisar mais mostrar, simplesmente descarte-os (o que acontecerá automaticamente se você não manter referência para os objetos).

Se a sua preocupação é paginação, você deve limitar a sua consulta. Cada consulta você delimita a partir de qual id deve buscar e a quantidade a ser recebida. No hibernate, pode utilizar os métodos setFirstResult e setMaxResults. Assim você só traz do banco o que vai exibir.

Falou.

[quote=wagnerfrancisco][quote=Gleidson Henrique][quote=wagnerfrancisco]
Mas você está executando a consulta novamente? Se você faz uma busca, carrega os dados em memória, altera os dados no banco, o Hibernate não vai automaticamente enxergar isto. É preciso repetir a consulta.
[/quote]

Estava pensando, guardar uma lista de informações ocupa muita memoria, estou pensando em fazer um esquema para guardar uma lista apenas com os IDs e a cada vez que for clicado para ir ao proximo registro, ele vai ao db e puxa as informações somente daquele registro…

Obrigado pela ajuda amigo… Qualquer coisa, volto a gritar aqui… rsrs

Abraços

[/quote]

Não sei exatamente qual o cenário que você tem, mas não vejo muito sentido nesta sua abordagem. Você não vai utilizar os objetos que traz do banco? Depois de utilizar, você descarta. A princípio não vejo pq armazenar os ids. Numa aplicação desktop, por exemplo, você possivelmente vai exibir uma coleção de dados em um combo ou uma tabela. Quando você não precisar mais mostrar, simplesmente descarte-os (o que acontecerá automaticamente se você não manter referência para os objetos).

Se a sua preocupação é paginação, você deve limitar a sua consulta. Cada consulta você delimita a partir de qual id deve buscar e a quantidade a ser recebida. No hibernate, pode utilizar os métodos setFirstResult e setMaxResults. Assim você só traz do banco o que vai exibir.

Falou.[/quote]

Então, sobre as JTable é realmente isso… possuo alguns campos que pesquiso, porém o problema era a paginação mesmo.

Não conheço esses dois métodos, mas acredito que seja justamente isso que eu preciso.

Muito obrigado amigo. Vou deixar o tópico ainda como aberto e volto aqui depois para falar os resultados…

Abraços