Pegar um valor na tabela que é atualizado pelo MySql durante a execução da aplicação

9 respostas
dymitrios

Boa tarde companheiros.

É o seguinte, fiz um While que fica verificando um campo da tabela num determinado ID até que o valor fique diferente de NULL, esse campo que está NULL é atualizado por outra aplicação, no caso estou simulando a atualização direta pelo MySql Workbench. Mas a minha aplicação java não atualiza.

Abaixo o código que fiz para o loop pegar o valor e o hibernate.cfg.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="current_session_context_class">thread</property>
    <property name="hibernate.transaction.flush_before_completion">true</property>
    <property name="hibernate.transaction.auto_close_session">true</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/credtudo</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">123</property>
    <mapping resource="hibernate/Consultas.hbm.xml"/>
    <mapping resource="hibernate/ResultadoConsultas.hbm.xml"/>
  </session-factory>
</hibernate-configuration>
public String pegaRespostaConsulta(){//Esse metodo deve pegar a resposta inserida pelo operador.
         session =CredTudoHibernateUtil.getSessionFactory().getCurrentSession();
         session.beginTransaction();

int i=1;
         while(resposta==null){//enquanto nao houver resposta do operador para consulta ele vai ficar consultando até ser direrente de nulo
        // if(resposta==null){

          try{
              Thread.sleep(1000);
              System.out.println("respsota="+resposta+" ID1="+pegaid()+" TIPOS="+tipos+" LUPE=="+i);
              Query retorno = session.createQuery("from ResultadoConsultas where CodigoResu = :id").setInteger("id",pegaid());
               List<ResultadoConsultas> resultadoconsultas = retorno.list();
               for (ResultadoConsultas c : resultadoconsultas) {
                    tipos=  c.getResultado();

                    resposta=tipos.toString();
                    session.getTransaction().commit();
               }
  // Object retorno = session.createSQLQuery("SELECT consultas.TipoConsulta as TipoConsulta FROM Consultas,resultado_consultas where Consultas.Codigo=resultado_consultas.CodigoResu").setFirstResult(1).setMaxResults(1).uniqueResult()
         }catch(Exception e){System.out.println("Erro:"+e); }


         i++;}

//session.close();


         return resposta;
     }

9 Respostas

Zeed01

Boa tarde colegas,

Amigo, muito estranho esse código… esta incompleto ? esta dando alguma exception ? o que a sua app java não atualiza ?

Coisas que não entendi:
O que é “tipos” ? Onde esta declarado ?
O que tem na classe ResultadoConsultas ? Se entendi você criou uma entidade para os resultados da consulta ? E também tem uma tabela no seu BD para isso ? Me parece estranho isso ser uma entidade.

Coloque o restante do código e o exception, se estiver ocorrendo.
Senão… explique melhor o que ocorre quando executa este método.

[]s

dymitrios

Não ocorre exception nenhuma... tipos está declarada fora do método. é um object.
O que ocorre é que eu atualizo o campo c.getResultado() na tabela pelo Workbench, minha aplicação continua pegando o valor NULL, sendo que era pra pegar outro valor, o que eu fiz update pelo Workbench.

Vou disponibilizar o restante da classe:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package credserver.DAOS;

import hibernate.CredTudoHibernateUtil;
import hibernate.ResultadoConsultas;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author Stwart
 */
public class DAOpegaResultado {
String resposta;
Object tipos;
int id1;
private Session session;

 public int pegaid(){
   session = CredTudoHibernateUtil.getSessionFactory().getCurrentSession();
   session.beginTransaction();
    List retorno =  session.createSQLQuery("SELECT MAX(CodigoResu) AS CodigoResu FROM Resultado_Consultas ").list();

   session.getTransaction().commit();
        Object i=  retorno.get(0);


  String id = i.toString();
    id1=Integer.parseInt(id) ;
  //  session.close();
    //System.out.println("ID="+id);
   return id1;
}


public String pegaRespostaConsulta(){//Esse metodo deve pegar a resposta inserida pelo operador.
         session =CredTudoHibernateUtil.getSessionFactory().getCurrentSession();
         session.beginTransaction();

int i=1;
         while(resposta==null){//enquanto nao houver resposta do operador para consulta ele vai ficar consultando até ser direrente de nulo
        // if(resposta==null){

          try{
              Thread.sleep(1000);
              System.out.println("respsota="+resposta+" ID1="+pegaid()+" TIPOS="+tipos+" LUPE=="+i);
              Query retorno = session.createQuery("from ResultadoConsultas where CodigoResu = :id").setInteger("id",pegaid());
               List<ResultadoConsultas> resultadoconsultas = retorno.list();
               for (ResultadoConsultas c : resultadoconsultas) {
                    tipos=  c.getResultado();

                    resposta=tipos.toString();
                    session.getTransaction().commit();
               }
  // Object retorno = session.createSQLQuery("SELECT consultas.TipoConsulta as TipoConsulta FROM Consultas,resultado_consultas where Consultas.Codigo=resultado_consultas.CodigoResu").setFirstResult(1).setMaxResults(1).uniqueResult()
         }catch(Exception e){System.out.println("Erro:"+e); }


         i++;}

//session.close();


         return resposta;
     }


}
Zeed01

Boa tarde galera,

Colega, você tem certeza que esta pegando o id correto no método pegaId() ?

Veja bem… você faz:

String id = i.toString();   
    id1=Integer.parseInt(id) ;   
   return id1;

Agora olhe o que diz o toString de Object (direto da documentação da API):
toString
public String toString()Returns a string representation of the object. In general, the toString method returns a string that “textually represents” this object. The result should be a concise but informative representation that is easy for a person to read. It is recommended that all subclasses override this method.
The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character `@’, and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of:

getClass().getName() + ‘@’ + Integer.toHexString(hashCode())

Returns:
a string representation of the object.

Não acredito que o seu id do banco seja igual ao retorno do toString de Object… ja que esse Integer.toHexString(hashCode) vai trazer um valor muito doido…

Sugestões:
Porque você usa Object ? Por que não utilizar o tipo correto ?
Porque faz um retorno.get(0) ao invés de algo como c.getInteger(CodigoResu) ?
Porque abre uma transacao somente para fazer um select na tabela ?
Porque utiliza um List retorno para uma consulta que só retorna um valor ?
Porque não fecha as sessões ?
Porque tipos esta declarado no escopo de classe e não no método que o utiliza ?
Porque tipos é um Object ?

Bom… chega de porquês…

[]s

dymitrios

O ID que estou pegando está correto. e a questão não está ai… peço que foque na questão…

Que é. Se eu atualizo a tabela pelo próprio java muda, agora se faço uma atualização do campo Resultado pelo Workbench ele nao muda.

Sugestões:
Porque você usa Object ? Por que não utilizar o tipo correto ? Me falaram pra fazer assim. E funciona não vejo porque mudar já que não altera desempenho.
Porque faz um retorno.get(0) ao invés de algo como c.getInteger(CodigoResu) ? Porque já fiz dessa forma e funciona.
Porque abre uma transacao somente para fazer um select na tabela ?Costume.
Porque utiliza um List retorno para uma consulta que só retorna um valor ?Porque já fiz dessa forma e funciona.
Porque não fecha as sessões ? PQ o hibernate fecha automaticamente se você olhar no hibernate.cfg que coloquei a sua disposição
Porque tipos esta declarado no escopo de classe e não no método que o utiliza ? Porque pretendo usar esse Tipos em outro método.
Porque tipos é um Object ? Me falaram pra fazer assim.

Zeed01

Boa tarde galera…

Nossa pareceu o meu chefe falando agora “foque na questão…” hehehehe

Desculpe, não quis e nem quero ser chato, mas fazer algo de uma determinada maneira “porque funciona” ou porque “me falaram para fazer assim”, não me parece uma boa pratica.
Já fiz muitas coisas porque alguem me disse que era a forma correta ou a melhor forma, mas acho que o mais importante é descobrir porque deve ser feito de um jeito ou de outro… acho que é a única maneira de realmente aprender e evoluir.
Claro que isso é a minha opinião, se acha bobagem é só desconsiderá-la.

Quanto a focar no problema, sinto muito se não pude ajudá-lo, mas foi exatamente o que tentei fazer, ou seja, na minha opinião, o se id.toString, onde id é um Object vai te retornar algo como
Banana@#&69423FDadfsdfe4343

E não creio que esse seja o seu ID no banco.

Agora para saber porque quando você atualiza pelo java ele funciona só vendo o resto do código…

Sugiro que faça um debug e verifique o que esta saindo na variavel id dentro do método pegaId() na linha String id = i.toString();

[]s

Edmilson.

dymitrios

Zeed está saindo o ID corretamente. conforme falei acima… já imprimi o valor e está correto. conforme eu preciso realmente. a questão não está aí…
O que eu preciso saber é como pegar algo no banco que foi feito update por uma aplicação externa…vc pode até esquecer o código inteiro ali se você souber como fazer isso… pois já fechei a conexão manualmente e nem assim funciona… sei que é alguma coisa que fiz errada… mas nao creio que seja ali. pois o pegaid retorna o ultimo id e é o que está acontecendo. eu imprimo a variavel para confirmar se está certo…

Zeed01

Bom dia galera,

Bom dymitrios, se você ja debugou o programa e disse que esta fazendo o select com o id correto e se esse id é único na sua tabela… então não sei mais como ajudá-lo.

Você disse que esta usando o mysql ?

Me desculpe pela teimosia… mas eu nao consigo aceitar que você esta fazendo i.toString (sendo que id é um Object) e esta obtendo um número como retorno… como eu disse o toString de Object retrona getClass().getName() + ‘@’ + Integer.toHexString(hashCode()), é o que esta na documentação…

Bom, boa sorte ai, outra coisa que pode ver é se o que você esta atualizando esta realmente sendo persistido no banco de dados…

[]s

dymitrios

Está sendo persistido sim, pois faço update diretamente pelo MySql Workbench e faço a consulta durante a execução do while e está lá o valor diferente de NULL e o while não sai.

J

Cara estou com o mesmo problema, vc conseguiu resolver?

Criado 1 de outubro de 2010
Ultima resposta 23 de nov. de 2010
Respostas 9
Participantes 3