Granite + Hibernate = LazyInitializationException

2 respostas
J

Boa tarde,

Estou tendo problemas com o LazyInitializationException do Hibernate, depois de desistir de fazer funcionar com o Blaze, resolvi migrar para o Granite, estou seguindo o tutorial da documentação (http://www.graniteds.org/confluence/display/DOC/5.+Lazy+Initialization) mas ainda assim estou tendo o erro. O Erro parece que ainda esta na camada Java. Abaixo segue as classe Java e Flex, das entidades Pessoa e Anuncio. Em anexo tem um log de erro.

Obrigado,

Jean

package br.com.pucpr.slmr.modulo.pessoa.beanentidade;

import java.io.Serializable;
import java.util.Collection;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

import br.com.pucpr.slmr.modulo.anuncio.beanentidade.Anuncio;
import br.com.pucpr.slmr.modulo.pessoa.model.IModuloPessoa;
import br.com.pucpr.slmr.util.SlmrException;

@Entity  
@Table(name="PESSOA", uniqueConstraints=@UniqueConstraint(columnNames="USUARIO"))
@SequenceGenerator(name = "INC_PESSOA", sequenceName = "SEQ_PESSOA_ID")
public class Pessoa implements Serializable, IModuloPessoa{
	
	private static final long serialVersionUID = 1L;
	
	private int    codigo;
	private String nome;
	private String usuario;
	private String senha;
	private String permissao;
	private String email;
	private String situacao;
	private String natureza;
	private String uf;	
	private Collection<Anuncio> anuncios;
	
	public Pessoa(){ }
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "INC_PESSOA")	
	@Column(name = "CODIGO")
	public int getCodigo() { return codigo; }
	public void setCodigo(int codigo) { this.codigo = codigo; }
	
	
	@Column(name = "NOME", length = 50)
	@Basic(optional = false)
	public String getNome() { return nome; }
	public void setNome(String nome) { this.nome = nome; }
	
	
	@Column(name = "USUARIO", length = 12)
	@Basic(optional = false)
	public String getUsuario() { return usuario; }
	public void setUsuario(String usuario) { this.usuario = usuario; }
	
	
	@Column(name = "SENHA", length = 32)
	@Basic(optional = false)
	public String getSenha() { return senha; }
	public void setSenha(String senha) { this.senha = senha; }
	
	
	@Column(name = "PERMISSAO", length = 1)
	@Basic(optional = false)
	public String getPermissao() { return permissao; }
	/** A = ADMINISTRADOR | U = USUARIO */		
	public void setPermissao(String permissao) throws SlmrException {
		if (!permissao.equalsIgnoreCase("A") && !permissao.equalsIgnoreCase("U")){
			throw new SlmrException("Permissão do Usuário Inválida");
		}
		this.permissao = permissao; 
	}
	
	
	@Column(name = "EMAIL", length = 50)
	@Basic(optional = false)
	public String getEmail() { return email; }
	public void setEmail(String email) { this.email = email; }
	
	
	@Column(name = "SITUACAO", length = 1)
	@Basic(optional = false)
	public String getSituacao() { return situacao; }
	/** A = ATIVO | I = INATIVO  @throws SlmrException */
	public void setSituacao(String situacao) throws SlmrException {
		if (!situacao.equalsIgnoreCase("A") && !situacao.equalsIgnoreCase("I")){
			throw new SlmrException("Situação do Usuário Inválida");
		}
		this.situacao = situacao; 
	}

	@OneToMany(mappedBy = "pessoa", fetch = FetchType.LAZY)	
	public Collection<Anuncio> getAnuncios() { return anuncios; }
	public void setAnuncios(Collection<Anuncio> anuncios) { this.anuncios = anuncios; }
	
	@Column(name = "NATUREZA", length = 2)
	@Basic(optional = false)
	public String getNatureza() { return natureza; }	
	public void setNatureza(String natureza) throws SlmrException {
		if (!natureza.equalsIgnoreCase("PF") && !natureza.equalsIgnoreCase("PF") && !natureza.equalsIgnoreCase("EX")){
			throw new SlmrException("Natureza Jurídica do Usuário Inválida");
		}
		this.natureza = natureza; 
	}
	
	@Column(name = "UF", length = 4)
	@Basic(optional = true)
	public String getUf() { return uf; }
	public void setUf(String uf) { this.uf = uf; }	
}
package br.com.pucpr.slmr.modulo.anuncio.beanentidade;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Date;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

import br.com.pucpr.slmr.modulo.anuncio.model.IModuloAnuncio;
import br.com.pucpr.slmr.modulo.pessoa.beanentidade.Pessoa;
import br.com.pucpr.slmr.modulo.residuo.beanentidade.Residuo;

@Entity
@Table(name="ANUNCIO")
@SequenceGenerator(name="INC_ANUNCIO", sequenceName="SEQ_ANUNCIO_ID")
public class Anuncio implements Serializable, IModuloAnuncio {

	private static final long serialVersionUID = 1L;
	
	private int codigo;	 
	private String resumo;
	private String detalhe;	 
	private BigDecimal quantidade;	 	 
	private BigDecimal valorUnidade;
	private String tipoAnuncio;	 
	private String formaDeEnvio;	 
	private Date dataAbertura;	 
	private Date dataFechamento;
	private boolean provisionaAtualiza;
	private BigDecimal provisionaQtdeDia;
	private boolean ativo;
	private Date dataAtualizacao;
	private boolean classificado;
	private Collection<Lance> lance;
	private Collection<Comentario> comentario;
	private Residuo residuo;
	private Pessoa pessoa;
	private BigDecimal quantidadeProvisao;
	private int quantidadeDias;
		
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO, generator="INC_ANUNCIO")
	@Column(name="CODIGO")
	public int getCodigo() { return codigo; }
	public void setCodigo(int codigo) { this.codigo = codigo; }
	
	@Column(name="RESUMO", length=60)
	@Basic(optional = false)
	public String getResumo() { return resumo; }
	public void setResumo(String resumo) { this.resumo = resumo; }
	
	@Column(name="DETALHE", length=20000)
	@Basic(optional = true)
	public String getDetalhe() { return detalhe; }
	public void setDetalhe(String detalhe) { this.detalhe = detalhe; }
	
	@Column(name = "QUANTIDADE", precision=13, scale=2)	
	@Basic(optional = false)
	public BigDecimal getQuantidade() { return quantidade; }
	public void setQuantidade(BigDecimal quantidade) { this.quantidade = quantidade; }

	@Column(name = "VALOR_UNIDADE", precision=13, scale=2)
	@Basic(optional = false)
	public BigDecimal getValorUnidade() { return valorUnidade; }
	public void setValorUnidade(BigDecimal valorUnidade) { this.valorUnidade = valorUnidade; }
	
	@Column(name = "TIPO_ANUNCIO", length=1)
	@Basic(optional = false)
	public String getTipoAnuncio() { return tipoAnuncio; }
	public void setTipoAnuncio(String tipoAnuncio) { this.tipoAnuncio = tipoAnuncio; }
	
	@Column(name = "FORMA_ENVIO", length=2)
	@Basic(optional = false)
	public String getFormaDeEnvio() { return formaDeEnvio; }
	public void setFormaDeEnvio(String formaDeEnvio) { this.formaDeEnvio = formaDeEnvio; }
	
	@Column(name = "DATA_ABERTURA")
	@Basic(optional = false)
	@Temporal(TemporalType.DATE)
	public Date getDataAbertura() { return dataAbertura; }
	public void setDataAbertura(Date dataAbertura) { this.dataAbertura = dataAbertura; }

	@Column(name = "DATA_FECHAMENTO")
	@Basic(optional = false)
	@Temporal(TemporalType.DATE)
	public Date getDataFechamento() { return dataFechamento; }
	public void setDataFechamento(Date dataFechamento) { this.dataFechamento = dataFechamento; }
	
	@Column(name="PROVISIONA_ATUALIZA")
	public boolean getProvisionaAtualiza() { return provisionaAtualiza; }
	public void setProvisionaAtualiza(boolean provisionaAtualiza) { this.provisionaAtualiza = provisionaAtualiza; }
	
	@Column(name = "PROVISIONA_QTDE_DIA", precision=13, scale=2)
	public BigDecimal getProvisionaQtdeDia() { return provisionaQtdeDia; }
	public void setProvisionaQtdeDia(BigDecimal provisionaQtdeDia) { this.provisionaQtdeDia = provisionaQtdeDia; }
	
	@Column(name="ATIVO")
	public boolean isAtivo() { return ativo; }
	public void setAtivo(boolean ativo) { this.ativo = ativo; }

	@Column(name = "DATA_ATUALIZACAO")
	@Basic(optional = false)
	@Temporal(TemporalType.DATE)
	public Date getDataAtualizacao() { return dataAtualizacao; }
	public void setDataAtualizacao(Date dataAtualizacao) { this.dataAtualizacao = dataAtualizacao; }
	
	@Column(name = "CLASSIFICADO")
	public boolean isClassificado() { return classificado; }
	public void setClassificado(boolean classificado) { this.classificado = classificado; }
	
	@OneToMany(mappedBy = "anuncio")
	@LazyCollection(LazyCollectionOption.FALSE)
	public Collection<Lance> getLance() { return lance; }
	public void setLance(Collection<Lance> lance) { this.lance = lance; }
	
	@OneToMany(mappedBy = "anuncio")
	@LazyCollection(LazyCollectionOption.FALSE)
	public Collection<Comentario> getComentario() { return comentario; }
	public void setComentario(Collection<Comentario> comentario) { this.comentario = comentario; }
	
	@ManyToOne
	@JoinColumn(name="ref_residuo", referencedColumnName = "codigo")
	@Basic(optional = false)
	public Residuo getResiduo() { return residuo; }
	public void setResiduo(Residuo residuo) { this.residuo = residuo; }
	
	@ManyToOne(fetch = FetchType.EAGER) 
	@JoinColumn(name="ref_pessoa", referencedColumnName = "codigo")
	@Basic(optional = false)
	public Pessoa getPessoa() { return pessoa; }
	public void setPessoa(Pessoa pessoa) { this.pessoa = pessoa; }

	@Transient
	public BigDecimal getQuantidadeProvisao() { return quantidadeProvisao; }
	public void setQuantidadeProvisao(BigDecimal quantidadeProvisao) { this.quantidadeProvisao = quantidadeProvisao; }
	
	@Transient
	public int getQuantidadeDias() { return quantidadeDias; }
	public void setQuantidadeDias(int quantidadeDias) { this.quantidadeDias = quantidadeDias; }
}
package br.com.pucpr.slmr.modulo.anuncio.beanentidade{

	import br.com.pucpr.slmr.modulo.pessoa.beanentidade.Pessoa;
	import br.com.pucpr.slmr.modulo.residuo.beanentidade.Residuo;
	
	import flash.utils.IDataInput;
	import flash.utils.IDataOutput;
	import flash.utils.IExternalizable;
	
	import mx.collections.ArrayCollection;
	
	import org.granite.collections.IPersistentCollection;
	import org.granite.meta;
	
	[RemoteClass(alias="br.com.pucpr.slmr.modulo.anuncio.beanentidade.Anuncio")]
	
	public class Anuncio implements IExternalizable{

		use namespace meta;
		private var __initialized:Boolean = true;
		private var __detachedState:String = null;
		

		
		private var _codigo:int;	
		private var _resumo:String;
		private var _detalhe:String;	 
		private var _quantidade:Number;	 	 
		private var _valorUnidade:Number;
		private var _tipoAnuncio:String;	 
		private var _formaDeEnvio:String;	 
		private var _dataAbertura:Date;	 
		private var _dataFechamento:Date;
		private var _provisionaAtualiza:Boolean;
		private var _provisionaQtdeDia:Number;
		private var _ativo:Boolean;
		private var _dataAtualizacao:Date;
		private var _classificado:Boolean;
		private var _lance:ArrayCollection;
		private var _comentario:ArrayCollection;
		private var _residuo:Residuo;
		private var _pessoa:Pessoa;
		private var _quantidadeProvisao:Number;
		private var _quantidadeDias:int;
		
		public function Anuncio(){
			_residuo = new Residuo();
		}


		[Bindable]
		public function get codigo():int{ return _codigo; }
		public function set codigo(value:int):void{ _codigo = value; }

		[Bindable]
		public function get resumo():String{ return _resumo; }
		public function set resumo(value:String):void{ _resumo = value; }

		[Bindable]
		public function get detalhe():String{ return _detalhe; }
		public function set detalhe(value:String):void{ _detalhe = value; }

		[Bindable]
		public function get quantidade():Number{ return _quantidade; }
		public function set quantidade(value:Number):void{ _quantidade = value; }

		[Bindable]
		public function get valorUnidade():Number{ return _valorUnidade; }
		public function set valorUnidade(value:Number):void{ _valorUnidade = value; }

		[Bindable]
		public function get tipoAnuncio():String{ return _tipoAnuncio; }
		public function set tipoAnuncio(value:String):void{ _tipoAnuncio = value; }

		[Bindable]
		public function get formaDeEnvio():String{ return _formaDeEnvio; }
		public function set formaDeEnvio(value:String):void{ _formaDeEnvio = value; }

		[Bindable]
		public function get dataAbertura():Date{ return _dataAbertura; }
		public function set dataAbertura(value:Date):void{ _dataAbertura = value; }

		[Bindable]
		public function get dataFechamento():Date{ return _dataFechamento; }
		public function set dataFechamento(value:Date):void{ _dataFechamento = value; }

		[Bindable]
		public function get provisionaAtualiza():Boolean{ return _provisionaAtualiza; }
		public function set provisionaAtualiza(value:Boolean):void{ _provisionaAtualiza = value; }

		[Bindable]
		public function get provisionaQtdeDia():Number{ return _provisionaQtdeDia; }
		public function set provisionaQtdeDia(value:Number):void{ _provisionaQtdeDia = value; }

		[Bindable]
		public function get ativo():Boolean{ return _ativo; }
		public function set ativo(value:Boolean):void{ _ativo = value; }

		[Bindable]
		public function get dataAtualizacao():Date{ return _dataAtualizacao; }
		public function set dataAtualizacao(value:Date):void{ _dataAtualizacao = value; }

		[Bindable]
		public function get classificado():Boolean{ return _classificado; }
		public function set classificado(value:Boolean):void{ _classificado = value; }

		[Bindable]
		public function get lance():ArrayCollection{ return _lance; }
		public function set lance(value:ArrayCollection):void{ _lance = value; }

		[Bindable]
		public function get comentario():ArrayCollection{ return _comentario; }
		public function set comentario(value:ArrayCollection):void{ _comentario = value; }

		[Bindable]
		public function get residuo():Residuo{ return _residuo; }
		public function set residuo(value:Residuo):void{ _residuo = value; }

		[Bindable]
		public function get pessoa():Pessoa{ return _pessoa; }
		public function set pessoa(value:Pessoa):void{ _pessoa = value; }
		
		[Bindable]
		public function get quantidadeProvisao():Number{ return _quantidadeProvisao; }
		public function set quantidadeProvisao(value:Number):void{ _quantidadeProvisao = value; }
		
		[Bindable]		
		public function get quantidadeDias():int{ return _quantidadeDias; }
		public function set quantidadeDias(value:int):void{ _quantidadeDias = value; }
		
		meta function isInitialized(name:String = null):Boolean {
			if (!name)
				return __initialized;
			
			var property:* = this[name];
			return (
				(!(property is Pessoa) || (property as Pessoa).meta::isInitialized()) &&
				(!(property is IPersistentCollection) ||
					(property as IPersistentCollection).isInitialized())
			);
		}
		/**
		 *	@private
		 */ 
		public function readExternal(input:IDataInput):void {
			__initialized = input.readObject() as Boolean;
			__detachedState = input.readObject() as String;
			if (meta::isInitialized()) {
				/*_address = input.readObject() as String;
				_city = input.readObject() as String;
				_country = input.readObject() as String;
				_id = function(o:*):Number { return (o is Number ? o as Number : Number.NaN) } (input.readObject());
				_name = input.readObject() as String;
				_price = function(o:*):Number { return (o is Number ? o as Number : Number.NaN) } (input.readObject());
				_state = input.readObject() as String;
				_zip = input.readObject() as String;*/
			}
			else {
				//_id = function(o:*):Number { return (o is Number ? o as Number : Number.NaN) } (input.readObject());
			}
		}
		
		/**
		 *	@private
		 */ 
		public function writeExternal(out:IDataOutput):void {
			// read only bean...
		}
	}
}
package br.com.pucpr.slmr.modulo.pessoa.beanentidade{
	import br.com.pucpr.slmr.modulo.anuncio.beanentidade.Anuncio;
	
	import flash.utils.IDataInput;
	import flash.utils.IDataOutput;
	import flash.utils.IExternalizable;
	
	import mx.collections.ArrayCollection;
	import mx.collections.ListCollectionView;
	
	import org.granite.collections.IPersistentCollection;
	import org.granite.meta;

	[RemoteClass(alias="br.com.pucpr.slmr.modulo.pessoa.beanentidade.Pessoa")]
	
	public class Pessoa implements IExternalizable{
		use namespace meta;
		private var __initialized:Boolean = true;
		private var __detachedState:String = null;

		meta function isInitialized(name:String = null):Boolean {
			if (!name)
				return __initialized;
			
			var property:* = this[name];
			return (
				
				(!(property is IPersistentCollection) || (property as IPersistentCollection).isInitialized())
			);
		}
		
		
		private var _codigo:int;
		private var _nome:String;
		private var _usuario:String;
		private var _senha:String;
		private var _permissao:String;
		private var _email:String;
		private var _situacao:String;
		private var _natureza:String;
		private var _uf:String;
		private var _anuncios:ListCollectionView;
		
		public function Pessoa(){
		}

		[Bindable]
		public function get codigo():int { return _codigo; }
		public function set codigo(value:int):void { _codigo = value; }

		[Bindable]
		public function get nome():String { return _nome; }
		public function set nome(value:String):void { _nome = value; }

		[Bindable]
		public function get usuario():String{ return _usuario; }
		public function set usuario(value:String):void { _usuario = value; }

		[Bindable]
		public function get senha():String{ return _senha; }
		public function set senha(value:String):void { _senha = value; }

		[Bindable]
		public function get permissao():String { return _permissao; }
		public function set permissao(value:String):void { _permissao = value; }

		[Bindable]
		public function get email():String { return _email; }
		public function set email(value:String):void { _email = value; }

		[Bindable]
		public function get situacao():String { return _situacao; }
		public function set situacao(value:String):void { _situacao = value; }

		[Bindable]
		public function get anuncios():ListCollectionView { return _anuncios; }
		public function set anuncios(value:ListCollectionView):void { _anuncios = value; }

		[Bindable]
		public function get natureza():String { return _natureza; }
		public function set natureza(value:String):void { _natureza = value; }

		[Bindable]
		public function get uf():String { return _uf; }
		public function set uf(value:String):void { _uf = value; }
		
		/**
		 *	@private
		 */ 
		public function readExternal(input:IDataInput):void {
			__initialized = input.readObject() as Boolean;
			__detachedState = input.readObject() as String;
			if (meta::isInitialized()) {
			}
			else {
				//_id = function(o:*):Number { return (o is Number ? o as Number : Number.NaN) } (input.readObject());
			}
		}
		
		/**
		 *	@private
		 */ 
		public function writeExternal(out:IDataOutput):void {
			// read only bean...
		}
	}
	
}

2 Respostas

A

cara,

se tiver dando esse erro na hora que vc tiver fazendo alguma consulta, basta vc usar a opcao FETCH nos seus joins.

t+

J

Eu estou usando as anotações abaixo, seriam essas?

@OneToMany(mappedBy = “pessoa”, fetch = FetchType.LAZY)
@ManyToOne(fetch = FetchType.EAGER)

Obrigado,

Jean

Criado 22 de outubro de 2011
Ultima resposta 22 de out. de 2011
Respostas 2
Participantes 2