Hibernate - retorno de valor incorreto

2 respostas
M

Oi pessoal,

A minha aplicação possui um bean com a seguinte estrutura:

public class Stand implements Serializable{

private code;
private name;

// métodos set e get

}

possui a seguinte lógica para atualizar um registro na tabela:

Session session = null;

Transaction tx = null;

session = HibernateSessionFactory.currentSession();

tx = session.beginTransaction();

Stand dbStand = (Stand) session.get(Stand.class, valueStand.getCode());

if (dbStand != null) {

dbStand.setName(valueStand.getName());

session.update(dbStand);

}

tx.commit();

Até aqui tudo bem, pois quando verifico a tabela, a atualização é feita corretamente.

O problema ocorre quando em outro ponto da aplicação, eu tento recuperar o valor da propriedade “name”.
Por exemplo, na tabela eu possuo apenas um registro, assim:

code = 1
name = EXPOMUSIC 2007

Quanto eu mando atualizar para “EXPOMUSIC 2008”, no mysql fica “EXPOMUSIC 2008” (o último valor), mas usando a rotina abaixo para recuperar o valor, ora o valor de name é “EXPOMUSIC 2007” e ora é “EXPOMUSIC 2008”, ou seja, nunca assume apenas um valor:

Session session = null;

Transaction tx = null;

session = HibernateSessionFactory.currentSession();

tx = session.beginTransaction();

StringBuffer sbfQuery = new StringBuffer();

sbfQuery.append(" SELECT s FROM Stand AS s “);

sbfQuery.append(” WHERE     s.code = ‘" + key + "’");

sbfQuery.append(" ORDER BY s.code");

Stand tmpStand = tmpStand = (Stand)session.createQuery(sbfQuery.toString()).uniqueResult();

System.out.println(tmpStand.getName()); // às vezes retorna “EXPOMUSIC 2007” e às vezes retorna “EXPOMUSIC 2008”.

tx.commit();

Alguém já teve este tipo de problema ? Teria alguma dica ??

Obrigado

2 Respostas

doug

Olá
Tenta usar session.flush(), depois de vc salvar ou de fazer update… talvez ajude no seu caso.

session.update(dbStand); 
session.flush();

Espero ter ajudado
Flwsss

M

Oi Thiago, obrigado pela resposta.

Eu inseri o flush() como você sugeriu, mas mesmo assim não funciona. Eu inseri também o método refresh() depois do update assim:

session.update(dbStand);

session.flush();

session.refresh(dbStand);

Mas ainda assim não funciona.

Parece que a aplicação mantém na memória, vários objetos com a mesma chave mas com conteúdos diferentes, assim quando uma query é executada, a aplicação retorna um dos objetos aleatóriamente.

Este é o método completo usado para realizar a query:

public Stand[] getStandsByName(String filterKey) {

/* will hold the entities we are going to return later */
List listReturn = new ArrayList();
/* a Hibernate session */
Session session = null;
/* we always need a transaction */
Transaction tx = null;

/* get session of the current thread */
session = HibernateSessionFactory.currentSession();

tx = session.beginTransaction();
	
StringBuffer sbfQuery = new StringBuffer();
sbfQuery.append(" SELECT s FROM Stand AS s ");
sbfQuery.append(" WHERE     s.name LIKE '%" + filterKey + "%'");
sbfQuery.append(" ORDER BY s.name");

List listTmp = session.createQuery(sbfQuery.toString()).list();
listReturn = new ArrayList();
for (Iterator iter = listTmp.iterator(); iter.hasNext();) {
	Stand tmpStand = (Stand) iter.next();
	listReturn.add(tmpStand);
}

tx.commit();

return (Stand[]) listReturn.toArray(new Stand[0]);

}

Tem alguma outra dica na manga, aí ? :smiley:

Valeu !!

Criado 27 de dezembro de 2008
Ultima resposta 29 de dez. de 2008
Respostas 2
Participantes 2