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...
}
}
}