ArrayList no Bean fica nulo (Ajuda aew)

4 respostas
sandro.csimas

tenho um managedbean chamado UsuarioBean e é do escopo session
As variaveis globais são inicializadas apenas uma vez?
seu construtor é chamado apenas uma vez ?

Tenho essa classe:
(Usuario)

@Entity
public class Usuario 
{	
	@Id
	@GeneratedValue
	@Column(name="id")
	private long id;

	@Column(name="email", length=50, unique=true, nullable=false)
	private String email;

	@Column(name="senha", length=20, nullable=false)
	private String senha;

	@OneToOne(mappedBy="usuario")
	@Cascade(CascadeType.ALL)
	private Perfil perfil = new Perfil();

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name="data_cadastro")
	private Date dataDeCadastro;
	
	public Usuario(){
		this.getPerfil().setUsuario(this);
	}
.
.
.

Usuario tem um perfil:
(Perfil)

@Entity
public class Perfil 
{
	@Id
	@GeneratedValue
	private long id;

	@OneToOne
	@JoinColumn(name="id_usuario")
	private Usuario usuario;

	@ManyToMany(fetch=FetchType.LAZY)
	@JoinTable(name="Amizade", schema="perfil", joinColumns={@JoinColumn(name="id_perfil")}, inverseJoinColumns={@JoinColumn(name="id_amigo")})
	private List<Perfil> amigos = new ArrayList<Perfil>();

	@OneToMany(mappedBy="perfil", fetch=FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	private List<Recado> recados = new ArrayList<Recado>();

	public Perfil(){
		
	}
.
.
.

um perfil pode ter varios recados:
(Recado)

@Entity
public class Recado 
{
	@Id
	@GeneratedValue
	private long id;

	@Column(name="conteudo")
	private String conteudo;
	
	@Column(name="id_remetente")
	private long idRemetente;
	
	@Temporal(TemporalType.TIME)
	@Column(name="horario_envio")
	private Date horarioEnvio;
	
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="id_perfil", nullable=true, updatable=true)
	@Cascade(CascadeType.ALL)
	private Perfil perfil;
	
	public Recado(){
		
	}
.
.
.

... pronto, agora eu tenho um recadoBean de escopo request

(RecadoBean)
public class RecadoBean {
	private Recado recado = new Recado();
	private Perfil perfil;

	public RecadoBean(){

	}

	public String save(){
		try{
			UsuarioBean usuarioBean = (UsuarioBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuarioBean");
			this.perfil = usuarioBean.getUsuario().getPerfil();
			HibernateUtil.getSession();
			HibernateUtil.beginTransaction();
			recado.setPerfil(this.perfil);
			recado.setIdRemetente(this.perfil.getId());
			perfil.getRecados().add(recado);
			HibernateUtil.getSession().save(recado);
			HibernateUtil.commitTransaction();
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		finally{
			HibernateUtil.closeSession();
		}
		return "recados.jsf";
	}

.
.
.

eu pego o usuarioBean da sessao pelo comando
UsuarioBean usuarioBean = (UsuarioBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuarioBean");

recupero o usuario pelo comando
this.perfil = usuarioBean.getUsuario().getPerfil();
ele retorna o perfil certo ..

o problema esta nessa linha:
perfil.getRecados().add(recado);

o erro:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: entidades.Perfil.recados, no session or session was closed

aqui esta o jsp:
<h3>Deixe um recado</h3>
						<rich:spacer height="10"/>
						<rich:editor id="editor" height="100" width="520" theme="simple" value="#{recadoBean.recado.conteudo}"/>
						<rich:spacer height="20"/>
						<h:commandButton value="Enviar recado" action="#{recadoBean.save}"/>

alguem pode me ajudar ? valeu galera.

4 Respostas

P

Do jeito que está fazendo vai ficar bem dificil manter esse código.

Separa as consultas do hibernate dos beans…

sandro.csimas

separar como ? criar classes DAO ?

P

Sim…

No Bean tu coloca um ArrayList, get e tudo mais…

É com o Hibernate tem sempre que dar um load no objeto e tal…

sandro.csimas

vc consegue identificar o problema ?
de estar vindo nulo ?

Criado 11 de fevereiro de 2010
Ultima resposta 12 de fev. de 2010
Respostas 4
Participantes 2