Erro na recuperação de objetos com hibernate e javassist

9 respostas
T

Olá pessoal…

Estamos com um problema aqui em nossa empresa, e estamos com dificuldade para achar a solução. Resumidamente temos o cenário:

Classe GrupoProduto
-subGrupoProdutoList

Classe SubGrupoProduto

  • grupoProduto

Classe Produto
-grupoProduto
-subGrupoProduto

Estamos recuperando os dados na seguinte ordem:

  • recuperamos todos os grupos de produto
  • recuperamos o produto
  • recuperamos os subgrupos do grupo do produto

Quando fazemos o último item, temos 2 objetos. Um deles acabamos obtendo sempre erro, pois ele vem da seguinte maneira:

SubGrupo_$$javaassist
Todas as propriedades são nulas, porém ele vem com um MethodHandler tipo JavassistLazyInitializer. Dentro deste, observamos que tem um item target, e neste existe a verdadeira referencia ao SubGrupoProduto em questão.

O que vem a ser isto? Pq deste comportamento? Qual a maneira de tratar estes casos ou corrigi-los?

Obrigado

9 Respostas

R

Se voce estiver recuperando com “Produto.grupoProduto().getId()”, provavelmente vai ficar javassist, e tambem desconheco uma solucao para ajustar

se estiver buscando com um hql voce pode fazer “from Produto as p left outer join fetch p.grupoProduto where …”

dessa forma ira vir o objeto grupoProduto corretamente.

O

rogerionj:
Se voce estiver recuperando com “Produto.grupoProduto().getId()”, provavelmente vai ficar javassist, e tambem desconheco uma solucao para ajustar

se estiver buscando com um hql voce pode fazer “from Produto as p left outer join fetch p.grupoProduto where …”

dessa forma ira vir o objeto grupoProduto corretamente.

blz… no meu caso também ocorria este erro, mas usando get e load quando o identificador não era encontrado… qual a solução?

R

Pois é, tambem procuro uma solução para isso, a busca ficaria mais pratica.

como nao encontrei nenhuma forma até o momento, fui obrigado a usar o hql com fetch como citado acima…

vamo ve se alguem fala sobre o assunto :smiley:

O

No meu caso eu substitui o get e load problematico pro uma busca simples usando criteria… código na integra… mas se houver uma solução melhor

public Object load(Class klass, long id) {
		// Cria nova consulta por criteria.
		Criteria criteria = session.createCriteria(klass);
		// Adiciona restrição a consulta.
		criteria.add(Restrictions.eq("id", id));
		// Executa consulta.
		Collection list = criteria.list();
		if (list == null || list.isEmpty())
			throw new EntityNotFoundException("Entidade " + klass.getName()
					+ " não encontrada para identificador " + id);
		// Retorna entidade.
		return list.iterator().next();
	}
R

tiagozc:
Olá pessoal…

Estamos com um problema aqui em nossa empresa, e estamos com dificuldade para achar a solução. Resumidamente temos o cenário:

Classe GrupoProduto
-subGrupoProdutoList

Classe SubGrupoProduto

  • grupoProduto

Classe Produto
-grupoProduto
-subGrupoProduto

Estamos recuperando os dados na seguinte ordem:

  • recuperamos todos os grupos de produto
  • recuperamos o produto
  • recuperamos os subgrupos do grupo do produto

Quando fazemos o último item, temos 2 objetos. Um deles acabamos obtendo sempre erro, pois ele vem da seguinte maneira:

SubGrupo_$$javaassist
Todas as propriedades são nulas, porém ele vem com um MethodHandler tipo JavassistLazyInitializer. Dentro deste, observamos que tem um item target, e neste existe a verdadeira referencia ao SubGrupoProduto em questão.

O que vem a ser isto? Pq deste comportamento? Qual a maneira de tratar estes casos ou corrigi-los?

Obrigado

Pessoal,

Desculpe por ressuscitar um tópico tão antigo, mas ainda não achei uma solução para o problema.

Alguém sabe como resolver isso sem utilizar criteria?

D

O que você está fazendo e o que precisa buscar do banco de dados?

R

Na verdade o problema é bem similar.
Estou fazendo o seguinte:

produto.getSubGrupoProduto().getGrupoProduto();

E eu preciso buscar do banco o grupoProduto.

Valeu pela ajuda.

L

esse metodo transforma o javassist de novo em um objeto modelo .

public Object  getUnproxyModel(Object model) {
    if (HibernateProxy.class.isAssignableFrom(model.getClass())) {
        return ((HibernateProxy)model).getHibernateLazyInitializer().getImplementation();
    }

    return model;
}
User user =(User) getUnproxyModel(UserJavassist);
C

Muito obrigado leandrorafael10, realmente o metodo funciona, resolveu o problema!!!

esse metodo transforma o javassist de novo em um objeto modelo .

view plaincopy to clipboardprint?

public Object  getUnproxyModel(Object model) {

if (HibernateProxy.class.isAssignableFrom(model.getClass())) {

return ((HibernateProxy)model).getHibernateLazyInitializer().getImplementation();

}
return model;

}
User user =(User) getUnproxyModel(UserJavassist);

Criado 13 de fevereiro de 2009
Ultima resposta 15 de jul. de 2014
Respostas 9
Participantes 7