JSF + Hibernate - Update no objeto

Galera eu tenho na minha aplicacao as classes Usuario, Perfil, DadosPessoais, Endereco e Telefone mapeadas pelo hibernate.
A classe Usuario tem relacionamento OneToOne com Perfil
A classe Perfil tem relacionamento OneToOne com Endereco, Telefone e DadosPessoais.

A classe UsuarioBean contem o atributo Usuario usuario e essa classe é do escopo session.

Na pagina jsp eu quero atualizar os dados pessoais de um certo usuario, para isso eu seto os atributos com:

#{usuarioBean.usuario.perfil.dadospessoais.nome}
#{usuarioBean.usuario.perfil.dadospessoais.sobrenome}
#{usuarioBean.usuario.perfil.dadospessoais.relacionamento}

nao sei se ta certo isso… ta muito grande hehehehe

sim… no UsuarioBean eu tenho o metodo update.
eu consigo nesse metodo recuperar todos os valores dos dados pessoais

consigo retornar o nome atraves do getUsuario.getPerfil.getDadosPessoais.getNome e consigo recuperar os outros atributos tb.

MInha duvida é a seguinte. Como alterar no banco os dados pessoais ?

O hibernate nao é bidirecional correto ?

se eu fizer apenas update(usuario) não consigo
aparece o codigo dizendo que inseriu, mais quando vou olhar no banco nada…

alguem me ajuda ?
Valeu!

amigao, “estar certo” depende do seu dominio, por exemplo, existe mesmo a necessidade de objetos como perfil e dadosPessoais, isso nao poderia ser um objeto apenas? bem, vai da sua solucao…

quanto a atualizar o banco, vc deve colocar os values dos campos com os valores como vc aparentemente fez, poste o codigo da sua view.

ai entao faça um merge no seu objeto, verifique o atributo cascade das associaçoes tb, talvez vc ta salvando usuario mas nao suas associaçoes

abrasssssss

Cascade.ALL

em casa em respondo direito e posto os codigos aqui.
valeu velhao

(AlunoBean)

public String atualizaPerfil(){ String retorno = "cancelaAlteracao"; try{ System.out.println(usuario.getPerfil().getDadosPessoais().getNome()); System.out.println(usuario.getPerfil().getUsuario().getEmail()); HibernateUtil.getSession().beginTransaction(); HibernateUtil.getSession().update(usuario); HibernateUtil.commitTransaction(); retorno = "sucessoAlteracao"; } catch (Exception e) { HibernateUtil.rollbackTransaction(); } finally{ HibernateUtil.closeSession(); } return retorno; }

ele imprime certinho o nome e email…

(Aluno)

[code]public Usuario(){
perfil.setUsuario(this);
}

@OneToOne(mappedBy=“usuario”)
@Cascade(CascadeType.ALL)
private Perfil perfil = new Perfil();[/code]

(Perfil)

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

(AtualizaPerfil.jsp)

<rich:tabPanel switchType="client" width="600px"> <rich:tab label="Dados Pessoais"> <h:panelGrid columns="2"> <h:outputText value="Nome:"/> <h:inputText value="#{usuarioBean.usuario.perfil.dadosPessoais.nome}"/> <h:outputText value="Sobrenome:"/> <h:inputText value="#{usuarioBean.usuario.perfil.dadosPessoais.sobrenome}"/> <h:outputText value="Apelido:"/> <h:inputText value="#{usuarioBean.usuario.perfil.dadosPessoais.apelido}"/> <h:outputText value="Relacionamento:"/> <h:inputText value="#{usuarioBean.usuario.perfil.dadosPessoais.relacionamento}"/> <h:outputText value="Sexo :"/> <h:selectOneMenu /> </h:panelGrid> </rich:tab> <rich:tab label="Endereço"> Here is tab #2 </rich:tab> <rich:tab label="Telefone"> Here is tab #3 </rich:tab> </rich:tabPanel> <h:commandButton value="Atualizar" action="#{usuarioBean.atualizaPerfil}"/> <h:commandButton value="Cancelar" action="cancelaAlteracao"/>

botei pra imprimir o getId do usuario… e me retornou 0
por isso nao tava conseguindo atualizar ;;

como faco pra poder pegar sempre o mesmo usuario ? no caso o que esta logado ?

[quote=sandro.csimas]botei pra imprimir o getId do usuario… e me retornou 0
por isso nao tava conseguindo atualizar ;;

como faco pra poder pegar sempre o mesmo usuario ? no caso o que esta logado ?[/quote]

Terás que usar sessão. No servlet, faça assim:

Usuario u = .... //objeto usuário
HttpSession session = request.getSession();
session.setAttribute("usuario", u);

no jsp você pega o atributo usuario como se fosse do request:

Nome do usuário: ${usuario.nome}

EDIT: pra fazer com jsf, de uma olhada neste post:
http://www.guj.com.br/posts/list/65589.java

eu acho que consegui aqui…
na minha pagina de cadastro… sempre que o usuario se cadastrava eu limpava o usuario (usuario = new Usuario() )
dai na hora de logar eu nao carregava ele ¬¬
dai ficava sem id afffffffffffffff

na hora de logar … eu puxo a lista de usuario com o email e senha digitados
se retornar um usuario entao eu faço

usuario = (Usuario) q.uniqueResult;

vou testar aqui

É galera, nao to conseguindo… to me batendo numa coisa besta.
Vou postar todo o codigo pra vcs verem

(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);
	}

(Perfil)

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

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

@Column(name="nome")
private String nome;

@Column(name="sobenome")
private String sobreNome;

@Column(name="apelido")
private String apelido;

@Column(name="sexo")
private String sexo;

@Column(name="relacionamento")
private String relacionamento;

@Temporal(TemporalType.DATE)
private Date nascimento;

@Column(name="bairro")
private String bairro;

@Column(name="rua")
private String rua;

@Column(name="numero_rua")
private String numeroRua;

@Column(name="cep")
private String CEP;

@Column(name="cidade")
private String cidade;

@Column(name="estado")
private String estado;

@Column(name="pais")
private String pais;

@Column(name="ddd1")
private String ddd1;

@Column(name="telefone1")
private String telefone1;

@Column(name="ddd2")
private String ddd2;

@Column(name="telefone2")
private String telefone2;

@ManyToMany
@Cascade(CascadeType.ALL)
@JoinTable(name="Amizade", schema="sandro")
private List<Perfil> amigos = new ArrayList<Perfil>();

public Perfil(){
	
}[/code]

(UsuarioBean)

[code]public class UsuarioBean
{
private Usuario usuario = new Usuario();

public UsuarioBean(){
	
}

public void setUsuario(Usuario usuario) {
	this.usuario = usuario;
}

public Usuario getUsuario() {
	return usuario;
}

public String cadastrar(){
	String retorno = "falhaCadastro";

	try{
		Query q = HibernateUtil.getSession().createQuery("from Usuario u where u.email = :email and u.senha = :senha");
		q.setString("email", usuario.getEmail()).setString("senha", usuario.getSenha());

		if(q.list().size() == 0){
			HibernateUtil.beginTransaction();
			usuario.setDataDeCadastro(new Date());
			HibernateUtil.getSession().save(usuario);
			HibernateUtil.commitTransaction();
			usuario = new Usuario();
			retorno = "sucessoCadastro";
		}
	}
	catch (Exception e) {
		e.printStackTrace();
		HibernateUtil.rollbackTransaction();
	}
	finally{
		HibernateUtil.closeSession();
	}
	return retorno;
}

public String logar(){
	String retorno = "falhaLogin";

	Query q = HibernateUtil.getSession().createQuery("from Usuario u where u.email = :email and u.senha = :senha");
	q.setString("email", usuario.getEmail()).setString("senha", usuario.getSenha());

	if(q.list().size() == 1){
		usuario = (Usuario) q.uniqueResult();
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("userlogged", true);
		retorno = "sucessoLogin";
	}
	HibernateUtil.closeSession();
	return retorno;
}

public String atualizaPerfil(){
	String retorno = "cancelaAlteracao";
	try{	
		System.out.println(usuario.getId());
		System.out.println(usuario.getPerfil().getUsuario());
		System.out.println(usuario.getPerfil().getNome());
		System.out.println(usuario.getPerfil().getSobreNome());
		System.out.println(usuario.getPerfil().getRelacionamento());
		HibernateUtil.getSession().beginTransaction();
		HibernateUtil.getSession().update(usuario);
		HibernateUtil.commitTransaction();
		retorno = "sucessoAlteracao";
	}
	catch (Exception e) {
		e.printStackTrace();
		HibernateUtil.rollbackTransaction();
	}
	finally{
		HibernateUtil.closeSession();
	}
	return retorno;
}

}[/code]

(atualizaPerfil.jsp)

<f:view> <h:form> <rich:tabPanel switchType="client" width="500px"> <rich:tab label="Dados Pessoais"> <h:panelGrid columns="2"> <h:outputText value="Nome:"/> <h:inputText value="#{usuarioBean.usuario.perfil.nome}"/> <h:outputText value="Sobrenome:"/> <h:inputText value="#{usuarioBean.usuario.perfil.sobreNome}"/> <h:outputText value="Apelido:"/> <h:inputText value="#{usuarioBean.usuario.perfil.apelido}"/> <h:outputText value="Relacionamento:"/> <h:inputText value="#{usuarioBean.usuario.perfil.relacionamento}"/> <h:outputText value="Sexo :"/> <h:selectOneMenu /> </h:panelGrid> </rich:tab> <rich:tab label="Endereço"> Here is tab #2 </rich:tab> <rich:tab label="Telefone"> Here is tab #3 </rich:tab> </rich:tabPanel> <h:commandButton value="Atualizar" action="#{usuarioBean.atualizaPerfil}"/> <h:commandButton value="Cancelar" action="cancelaAlteracao"/> </h:form> </f:view>

no atualiza perfil eu consigo exibir tudo do usuario… o id, o nome, sobrenome, relacionamento
inclusive o usuario daquele perfil aqui:

System.out.println(usuario.getPerfil().getUsuario());

mostra o sql da inserção

mais nao aparece no banco

=/

alguem te alguma ideia ?

Alias, na hora da atualizacao nao esta mostrando nenhuma linha do sql
deveria estar né ?

[quote=sandro.csimas]Alias, na hora da atualizacao nao esta mostrando nenhuma linha do sql
deveria estar né ?[/quote]

depende… pra mostrar o SQL no log tem q colocar no hibernate.cfg.xml

<property name="format_sql">true</property>