aplicação não está persistindo

12 respostas
erikamilhomem

Olá pessoal, estou a uns dias tentando entender pq minha aplicação não está persistindo. Quando estarto o server e abro a plicação pelo navegador, funciona, insiro os dados mas quando clico no botão salvar não acontece nada, não salva e nem emite mensagem nenhuma. já não sei mais o que faço, me ajudem por favor.

vou colocar os códigos pra olharem e se puderem me ajudem por favor.

Classe modelo Usuario:
package br.com.model;

import java.io.Serializable;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;

@Entity
@Table(name = "usuario")
public class Usuario implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue
	@Column(name = "id", nullable = false, unique = true)
	private Integer id;

	@Column(name = "nome", length = 50, nullable = false)
	private String nome;

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

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

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "datainatividade")
	private Calendar dataInatividade;

	public Usuario() {

	}

	@ElementCollection(targetClass = String.class)
	@JoinTable(name = "usuariopermissao", uniqueConstraints = { @UniqueConstraint(columnNames = {
			"usuario", "permissao" }) }, joinColumns = @JoinColumn(name = "usuario"))
	@Column(name = "permissao", length = 50)
	private Set<String> permissao = new HashSet<String>();

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public Calendar getDataInatividade() {
		return dataInatividade;
	}

	public void setDataInatividade(Calendar dataInatividade) {
		this.dataInatividade = dataInatividade;
	}

	public Set<String> getPermissao() {
		return permissao;
	}

	public void setPermissao(Set<String> permissao) {
		this.permissao = permissao;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((dataInatividade == null) ? 0 : dataInatividade.hashCode());
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((login == null) ? 0 : login.hashCode());
		result = prime * result + ((nome == null) ? 0 : nome.hashCode());
		result = prime * result
				+ ((permissao == null) ? 0 : permissao.hashCode());
		result = prime * result + ((senha == null) ? 0 : senha.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Usuario other = (Usuario) obj;
		if (dataInatividade == null) {
			if (other.dataInatividade != null)
				return false;
		} else if (!dataInatividade.equals(other.dataInatividade))
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (login == null) {
			if (other.login != null)
				return false;
		} else if (!login.equals(other.login))
			return false;
		if (nome == null) {
			if (other.nome != null)
				return false;
		} else if (!nome.equals(other.nome))
			return false;
		if (permissao == null) {
			if (other.permissao != null)
				return false;
		} else if (!permissao.equals(other.permissao))
			return false;
		if (senha == null) {
			if (other.senha != null)
				return false;
		} else if (!senha.equals(other.senha))
			return false;
		return true;
	}

}

Interface IDaoUsuario:

package br.com.dao;

import java.io.Serializable;
import java.util.List;

import br.com.ueg.tc.model.Usuario;

public interface IDaoUsuario {

	void save(Usuario usuario);

	void update(Usuario usuario);

	void remove(Usuario usuario);

	Usuario getById(Serializable id);

	Usuario getByLogin(String login);

	List<Usuario> listar();

}

DaoUsuario:

package br.com.dao;

import java.io.Serializable;
import java.util.List;

import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;

import org.hibernate.Query;
import org.hibernate.Session;

import br.com.ueg.tc.model.Usuario;

@ManagedBean
@ApplicationScoped
public class DaoUsuario implements IDaoUsuario, Serializable {

	private static final long serialVersionUID = 1L;

	private Session session;

	public void setSession(Session session) {
		this.session = session;
	}

	@Override
	public void save(Usuario usuario) {
		this.session.save(usuario);

	}

	@Override
	public void update(Usuario usuario) {
		if (usuario.getPermissao() == null
				|| usuario.getPermissao().size() == 0) {
			Usuario usuarioPermissao = this.getById(usuario.getId());
			usuario.setPermissao(usuarioPermissao.getPermissao());
			this.session.evict(usuarioPermissao);
		}
		this.session.update(usuario);

	}

	@Override
	public void remove(Usuario usuario) {
		this.session.delete(usuario);

	}

	@Override
	public Usuario getById(Serializable id) {
		return (Usuario) this.session.get(Usuario.class, id);
	}

	@Override
	public Usuario getByLogin(String login) {
		String hql = "select u from Usuario u where u.login = :login";
		Query consulta = this.session.createQuery(hql);
		consulta.setString("login", login);
		return (Usuario) consulta.uniqueResult();

	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Usuario> listar() {
		return this.session.createCriteria(Usuario.class).list();
	}

}

Classe das regras de negócio BUsuario:

package br.com.ueg.tc.business;

import java.io.Serializable;
import java.util.List;

import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;

import br.com.ueg.tc.model.Usuario;
import br.com.ueg.tc.util.BException;
import br.com.ueg.tc.dao.DaoUsuario;

@ManagedBean
@ApplicationScoped
public class BUsuario implements Serializable {

	private static final long serialVersionUID = 1L;
	@ManagedProperty(value = "#{daoUsuario}")
	private DaoUsuario daoUsuario;

	public DaoUsuario getDaoUsuario() {
		return daoUsuario;
	}

	public void setDaoUsuario(DaoUsuario daoUsuario) {
		this.daoUsuario = daoUsuario;
	}

	public void save(Usuario usuario) {
		Integer id = usuario.getId();
		if (id == null || id == 0) {
			usuario.getPermissao().add("ROLE_USUARIO");
			this.daoUsuario.save(usuario);
		} else {
			this.daoUsuario.update(usuario);
		}
	}

	public void update(Usuario usuario) {
		this.daoUsuario.update(usuario);

	}

	public void remove(Usuario usuario) throws BException {
		if (usuario.getPermissao().equals("ROLE_ADMINISTRADOR")) {
			throw new BException(
					"Usuários administradores não podem ser excluídos.");
		} else {
			this.daoUsuario.remove(usuario);

		}

	}

	public Usuario getById(Serializable id) {
		return this.daoUsuario.getById(id);
	}

	public Usuario getByLogin(String login) {
		return this.daoUsuario.getByLogin(login);

	}

	public List<Usuario> listar() {
		return this.daoUsuario.listar();
	}

}

Controlador(service) UsuarioBean:

package br.com.ueg.tc.control;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import br.com.ueg.tc.business.BUsuario;
import br.com.ueg.tc.model.Usuario;
import br.com.ueg.tc.util.BException;

@ManagedBean(name = "usuarioBean")
@RequestScoped
public class UsuarioBean {

	private Usuario usuario = new Usuario();
	private String confirmarSenha;
	private List<Usuario> lista;

	@ManagedProperty(value = "#{bUsuario}")
	private BUsuario bUsuario;

	public Usuario getUsuario() {
		return usuario;
	}

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

	public String getConfirmarSenha() {
		return confirmarSenha;
	}

	public void setConfirmaSenha(String confirmarSenha) {
		this.confirmarSenha = confirmarSenha;
	}

	public BUsuario getbUsuario() {
		return bUsuario;
	}

	public void setbUsuario(BUsuario bUsuario) {
		this.bUsuario = bUsuario;
	}

	// create
	public String novo() {
		this.usuario = new Usuario();
		// this.usuario.setDataInatividade(null);
		return "/admin/usuario";
	}

	public String salvar() {
		FacesContext context = FacesContext.getCurrentInstance();

		String senha = this.usuario.getSenha();
		if (!senha.equals(this.confirmarSenha)) {
			FacesMessage facesMessage = new FacesMessage(
					"A senha não foi confirmada corretamente.");
			context.addMessage(null, facesMessage);
			return null;
		}

		bUsuario.save(this.usuario);

		return "/public/usuarioSucesso";
	}

	// Read
	public List<Usuario> getLista() {
		if (this.lista == null) {

			this.lista = bUsuario.listar();
		}
		return this.lista;
	}

	// Update
	public String editar() {
		this.confirmarSenha = this.usuario.getSenha();
		return "/admin/usuario";
	}

	// Delete
	public String excluir() throws BException {

		bUsuario.remove(this.usuario);
		return null;
	}

}
View Usuário
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:p="http://primefaces.org/ui">

<h:head>
	<meta http-equiv="Content-Type"
		content="Ttext/html; chareset=ISO-8859-1" />
	<title>Cadastro de Usuários</title>
</h:head>

<h:body>

	<h1 />


	<h:form id="cadastro">
		<p:messages />
		<h:inputHidden value="#{usuarioBean.usuario.id}" />
		<h:inputHidden value="#{usuarioBean.usuario.dataInatividade}" />
		<h:inputHidden value="#{usuarioBean.usuario.permissao}" />

		<p:panelGrid columns="1">
			<f:facet name="header">  
      	  		Cadastro de Usuários  
    		</f:facet>

			<h:outputLabel for="nome" value="Nome: *" />
			<p:inputText id="nome" value="#{usuarioBean.usuario.nome}"
				required="true" label="Nome" size="50" maxlength="50"
				requiredMessage="Favor insira o nome.">
				<f:validateLength minimum="10" maximum="50" />
			</p:inputText>

			<h:outputLabel for="login" value="Login: *" />
			<p:inputText id="login" value="#{usuarioBean.usuario.login}"
				required="true" label="Login" size="20" maxlength="20"
				validatorMessage="Login deve ter no mínimo 8 e no máximo 
				20 caracteres e só pode ter os símbolos '.' e '_'.">
				<f:validateRegex pattern="([a-z]|[0-9]|[.]|[_]|[8,20])" />
			</p:inputText>

			<h:outputLabel for="senha" value="Senha: *" />
			<h:inputSecret id="senha" value="#{usuarioBean.usuario.senha}"
				label="Senha" size="10" maxlength="10" required="true"
				redisplay="true" />

			<h:outputLabel for="confirmarsenha" value="Confrimar senha: *" />
			<h:inputSecret id="confirmarsenha"
				value="#{usuarioBean.confirmarSenha}" label="Confirmar senha"
				size="10" maxlength="10" required="true" redisplay="true" />

			<f:facet name="footer">
				<p:commandButton value="Salvar" action="#{usuarioBean.salvar()}" />
			</f:facet>

		</p:panelGrid>
	</h:form>
</h:body>
</html>

12 Respostas

marcelo.silva.java
private Session session;  
private Transaction tx;
  
    public void setSession(Session session) {  
        this.session = session;  
        this.tx = session.beginTransaction();
    }  
  
    @Override  
    public void save(Usuario usuario) {  
        this.session.save(usuario);  
        this.tx.commit();
  
    }

testa essas alterações...

[]s

erikamilhomem

mesmo tendo essa classe eu preciso fazer isso? talvez esteja usando da maneira errada.

package br.com.ueg.tc.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.hibernate.SessionFactory;

import br.com.ueg.tc.util.HibernateUtil;

public class ConexaoHibernateFilter implements Filter {
	
	private SessionFactory sessionFactory;

	//executado somente quando o aplicativo web é colocado no ar.
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		this.sessionFactory = HibernateUtil.getSessionFactory();	
		
	}

	//interceptação requisição web
	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
			FilterChain chain) throws IOException, ServletException {
		try {
			this.sessionFactory.getCurrentSession().beginTransaction();
			chain.doFilter(servletRequest, servletResponse);
			this.sessionFactory.getCurrentSession().getTransaction().commit();
			this.sessionFactory.getCurrentSession().close();
			
		} catch (Throwable ex) {
			try {
				if(this.sessionFactory.getCurrentSession().getTransaction().isActive()){
					this.sessionFactory.getCurrentSession().getTransaction().rollback();
				}
				
			} catch (Throwable t) {
				t.printStackTrace();
			}
			throw new ServletException(ex);
		}
				
	}
	
	//executado quando o aplicativo web é destivado do servidor
	@Override
	public void destroy() {
		
		
	}

}
erikamilhomem

essa classe que vai abrir, iniciar a transação e fazer comit. Deve ter alguma coisa que não estou fazendo.

erikamilhomem

No meu web.xml tem essa tag permitindo que a requisição seja interceptada e a classe filter mostrada acima seja responsável por iniciar e encerrar a sessão e tbm fazer comit em fim.

<!-- Configuração ConexãoHibernateFilter --> <filter> <filter-name>conexaoFilter</filter-name> <filter-class>br.com.ueg.tc.filter.ConexaoHibernateFilter</filter-class> </filter> <filter-mapping> <filter-name>conexaoFilter</filter-name> <url-pattern>*.jsf</url-pattern> </filter-mapping>

erikamilhomem

marcelo.silva.java mesmo fazendo a alteração não deu certo. :frowning:
esse trem não persiste.

marcelo.silva.java

cara aonde no seu codigo vc pega sessao...

primeiro vc pega a sessao e abre a mesma

dessa sessao vc abre uma transacao...

um exemplo seria
public class HibernateUtil {

    private static final SessionFactory sessionFactory;
    
    static {
        try {
           
            sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
        } catch (Throwable ex) {
           
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }
    
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

e o dao seria assim

public class LoginDao {

    private Session session;
    private Transaction transaction;

    public LoginDao() {
        this.session = HibernateUtil.getSessionFactory().openSession();
        this.transaction = session.beginTransaction();
    }
//aqui vc usa sua logica no seu caso seria esse metodo

 @Override  
    public void save(Usuario usuario) {  
        this.session.save(usuario);  
        this.transaction.commit();
}
}
erikamilhomem
package br.com.ueg.tc.util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

public class HibernateUtil {
    
    private static final SessionFactory sessionFactory;
    //public static final String HIBERNATE_SESSION = "hibernate_session";
    
    static{
        
        try {
            
            System.out.println("Tentando configurar a SF");
            
            Configuration configuration = new Configuration().configure();
            
            ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().
                applySettings(configuration.getProperties()).buildServiceRegistry();
            
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
            
            System.out.println("Session factory criada corretamente");
        } catch (Exception ex) {
            System.out.println("Ocorreu um  erro ao iniciar a SF. " + ex);
            throw new ExceptionInInitializerError(ex);
        }
        
        
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
    
}
erikamilhomem

preciso de ajuda qualquer dúvida estou a disposição.

Nicolas_Fernandes

Oi, erikamilhomem, tudo bem?
Sua conexão possui transações abertas no momento de salvar? Confira o status da conexão, o status das transações e vê se pode ser isso. Em primeira vista, não vejo nada de errado com sua persistência.

erikamilhomem

Olá, Nicolas Fernandes, estou bem obrigada!

olha só, mas nem chega no banco de dados, como pode ser isso?

mas mesmo assim como faço para “Confira o status da conexão, o status das transações”?

Nicolas_Fernandes
erikamilhomem:
Olá, Nicolas Fernandes, estou bem obrigada!

olha só, mas nem chega no banco de dados, como pode ser isso?

mas mesmo assim como faço para "Confira o status da conexão, o status das transações"?

Então, Erika. Eu quis dizer para você depurar sua aplicação, passando com os breakpoints no momento em que você abre sua conexão, verificando se ela tem transação aberta, no momento onde vai salvar, se nesse momento há transações abertas. Está gerando alguma exceção que você está esquecendo de pegar? Pode ser aí que encontra-se o problema, também.

Faça esses dois testes: 1. Depure esses pontos: quando abre a conexão e quando vai executar o método salvar. Verifique se há transações ativas. Se houver, você deve comitá-las ao final das operações para surtirem efeito no banco de dados; 2. Lance exceções na declaração dos seus métodos e pegue-as nas camadas acima, porque talvez pode existir um erro que você não está vendo.
// no DAO...
public Usuario save(Usuario usuario) throws HibernateException, Exception {
    this.session.save(usuario);
    return usuario;
}

//no BL:
public Usuario save(Usuario usuario) throws HibernateException, Exception {

    Integer id = usuario.getId();  
    if (id == null || id == 0) {  
        usuario.getPermissao().add("ROLE_USUARIO");  
        this.daoUsuario.save(usuario);  
    } else {  
        this.daoUsuario.update(usuario);  
    } 
 
     return usuario;

// no Managed Bean:
public String salvar() {  
    FacesContext context = FacesContext.getCurrentInstance();  
  
    String senha = this.usuario.getSenha();  
    if (!senha.equals(this.confirmarSenha)) {  
        FacesMessage facesMessage = new FacesMessage(  
            "A senha não foi confirmada corretamente.");  
        context.addMessage(null, facesMessage);  
        return null;  
    }  
  
    try {
        bUsuario.save(this.usuario);  
    }
    catch (HibernateException hibernateException) {
        System.out.println(String.format("Erro do Hibernate => %s %s", 
            hibernateException.getMessage(), hibernateException.getStackTrace());
    }
    catch (Exception exception) {
        System.out.println(String.format("Erro geral => %s %s", 
            exception.getMessage(), exception.getStackTrace());
    }
    return "/public/usuarioSucesso";  
}

Analisa essas ideias e me dê um reply. :D

erikamilhomem

Fiz o debug, o que acontece é o seguinte:

Primeiro para aqui(linha em negrito)
...
  
public class ConexaoHibernateFilter implements Filter {  
      
    private SessionFactory sessionFactory;  
  
    //executado somente quando o aplicativo web é colocado no ar.  
    @Override  
    public void init(FilterConfig filterConfig) throws ServletException {  
       [u][b] this.sessionFactory = HibernateUtil.getSessionFactory();  [/b]    [/u]
          
    }  
  
   ...
  
}
clico no próximo, ele vai para:
...

public class HibernateUtil {

	[u][b]private static final SessionFactory sessionFactory = buildSessionFactory();[/b][/u]
	
	@SuppressWarnings("deprecation")
	private static SessionFactory buildSessionFactory(){
		try {
			Configuration configuration =  new Configuration();
			configuration.configure("hibernate.cfg.xml");
			return configuration.buildSessionFactory();
		} catch (Exception e) {
			
			System.out.println("Criação inicial do objeto SessionFactory falhoy. Erro: " + e);
			throw new ExceptionInInitializerError(e);
		}
	}
	[u][b]public static SessionFactory getSessionFactory(){
		return sessionFactory;[/b][/u]
	}
}

Daí inicia o servido, depois abro o navegador e chamo a aplicação ele me dá opção de avançar
parando aqui:

[code]
...
public class ConexaoHibernateFilter implements Filter {

private SessionFactory sessionFactory;

//executado somente quando o aplicativo web é colocado no ar.
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.sessionFactory = HibernateUtil.getSessionFactory();

}

//interceptação requisição web
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain chain) throws IOException, ServletException {
try {
this.sessionFactory.getCurrentSession().beginTransaction();
chain.doFilter(servletRequest, servletResponse);
this.sessionFactory.getCurrentSession().getTransaction().commit();
this.sessionFactory.getCurrentSession().close();

} catch (Throwable ex) {
try {
if(this.sessionFactory.getCurrentSession().getTransaction().isActive()){
this.sessionFactory.getCurrentSession().getTransaction().rollback();
}

} catch (Throwable t) {
t.printStackTrace();
}
throw new ServletException(ex);
}

}

//executado quando o aplicativo web é destivado do servidor
@Override
public void destroy() {


}

} [code]

depois insiro os dados na view e clico em salvar e ele me dá opção de próximo passo, que é a mesma linha
e assim fica não sai desse linha this.sessionFactory.getCurrentSession().beginTransaction();

Criado 10 de abril de 2013
Ultima resposta 20 de abr. de 2013
Respostas 12
Participantes 3