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)
[code]@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);
}
.
.
.[/code]
Usuario tem um perfil:
(Perfil)
[code]@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(){
}
.
.
.
[/code]
um perfil pode ter varios recados:
(Recado)
[code]@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(){
}
.
.
.
[/code]
… pronto, agora eu tenho um recadoBean de escopo request
(RecadoBean)
[code]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";
}
.
.
.
[/code]
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.