JSF + Hibernate - Update no objeto

9 respostas
sandro.csimas

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!

9 Respostas

renanreismartins

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

sandro.csimas

Cascade.ALL

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

sandro.csimas
(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)
public Usuario(){
		perfil.setUsuario(this);
	}

@OneToOne(mappedBy="usuario")
	@Cascade(CascadeType.ALL)
	private Perfil perfil = new Perfil();
(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"/>
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 ?

g4j

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 ?

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

sandro.csimas

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

sandro.csimas

É 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)

@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(){
		
	}

(UsuarioBean)

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

(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 ?

sandro.csimas

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

darkan666

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

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

<property name="format_sql">true</property>
Criado 5 de fevereiro de 2010
Ultima resposta 6 de ago. de 2012
Respostas 9
Participantes 4