Não consigo setar ID do usuário logado para relação de tabela com Hibernate e Spring S

5 respostas
DiogoLPJ

Oi pessoal,

Tudo que estou tentando fazer é setar o id do usuário (id da tabela/classe usuário) e o nick (username da tabela/classe usuario) da tabela/classe mensagem para um chat rudimentar que estou fazendo.

Preciso disso pois gravo numa tabela, e faço o frame de mensagens exibir o nº da mensagem, o usuario, para quem ele está enviando e a mensagem em si.

Segue meus códigos:

Mensagem.class:

package entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;


@Entity
@Table
public class Mensagem {
	
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column
	private Integer idMensagem;
	
	@Column(length = 25)
	private String nick;

	@Column(length = 25)
	private String mensagem;

	@Column(length = 25, columnDefinition = "default 'TODOS'")
	private String para;	
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name="id_usuario", insertable= true, updatable= true)
	@Fetch(FetchMode.JOIN)
	private Usuario usuario;
	
	public Mensagem() {

	}

	public String toString() {
		return idMensagem + "," + nick + "," + mensagem + "," + para;
	}

	public Integer getIdMensagem() {
		return idMensagem;
	}

	public void setIdMensagem(Integer idMensagem) {
		this.idMensagem = idMensagem;
	}

	public String getNick() {
		return nick;
	}

	public void setNick(String nick) {
		this.nick = nick;
	}

	public String getMensagem() {
		return mensagem;
	}

	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
	}

	public String getPara() {
		return para;
	}

	public void setPara(String para) {
		this.para = para;
	}

	public Usuario getUsuario() {
		return usuario;
	}

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

}

Usuario.class:

package entity;

import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
//import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table
public class Usuario {

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column
	private Integer idusuario;
	@Column
	private String nome;
	@Column(unique=true)
	private String username;
	@Column
	private String password;
	@Column
	private String authority;
	
	@OneToMany(mappedBy="usuario",fetch=FetchType.LAZY)
	private List<Mensagem> mensagem;
	
	public Usuario() {
		// TODO Auto-generated constructor stub
	}

	public Usuario(Integer idusuario, String nome, String username,
			String password, String authority) {
		this.idusuario = idusuario;
		this.nome = nome;
		this.username = username;
		this.password = password;
		this.authority = authority;
	}

	public Integer getIdusuario() {
		return idusuario;
	}

	public void setIdusuario(Integer idusuario) {
		this.idusuario = idusuario;
	}

	public String getNome() {
		return nome;
	}

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

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getAuthority() {
		return authority;
	}

	public void setAuthority(String authority) {
		this.authority = authority;
	}

	public List<Mensagem> getMensagem() {
		return mensagem;
	}

	public void setMensagem(List<Mensagem> mensagem) {
		this.mensagem = mensagem;
	}
	
}

MensagemDao.class:

package persistence;

import java.util.List;

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

import entity.Mensagem;
import entity.Usuario;
public class MensagemDao {

	Session session;
	Transaction transaction;
	Query query;
	
	  public void create(Mensagem m, Usuario u) throws Exception{
	   session = HibernateUtil.getSessionFactory().openSession();
	   transaction = session.beginTransaction();
	   		session.save(m);
	   transaction.commit();
	   session.close();  
	  }
	  
	  @SuppressWarnings("unchecked")
	public List <Mensagem> findAll() throws Exception{
		  session = HibernateUtil.getSessionFactory().openSession();
		  List <Mensagem> lista = session.createQuery("from Mensagem").list();
		  session.close();
		  return lista;
	  }
	  
	  
	  
}

UsuarioDao.class

package persistence;

import org.springframework.orm.hibernate3.HibernateTemplate;
import org.hibernate.*;

import entity.Usuario;

public class UsuarioDao {

	private HibernateTemplate hibernate;
	
	public void setSessionFactory(SessionFactory sessionFactory){
		 hibernate = new HibernateTemplate(sessionFactory);
	}//injeção de dependência
	
	public void create(Usuario u) throws Exception{
		
		Session session = hibernate.getSessionFactory().openSession();
		Transaction transaction = session.beginTransaction();
		session.save(u);
		transaction.commit();
		session.close();
		
	}
	
	
}

ManagerBeanMensagem.class (o principal):

package manager;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import persistence.MensagemDao;
import entity.Mensagem;
public class ManagerBeanMensagem {
	
	private Mensagem mensagem;
    private List <Mensagem> listamensagem;
    
	public List<Mensagem> getListamensagem() {
		try{
		listamensagem= new MensagemDao().findAll();
		}catch(Exception e){
		}
		return listamensagem;
	}

	public void setListamensagem(List<Mensagem> listamensagem) {
		this.listamensagem = listamensagem;
	}

	public ManagerBeanMensagem() {
		mensagem = new Mensagem();
	}
	
	public Mensagem getMensagem() {
		return mensagem;
	}

	public void setMensagem(Mensagem mensagem) {
		this.mensagem = mensagem;
	}
	
	public void cadastro(){
		
		FacesContext fc = FacesContext.getCurrentInstance();
		
		try{
			
			MensagemDao d = new MensagemDao();
			d.create(mensagem, null);
			
			mensagem = new Mensagem();
			
			fc.addMessage("form1", new FacesMessage("Dados gravados"));
		}
		catch(Exception e){
			fc.addMessage("form1", new FacesMessage(e.getMessage()));
		}
		
	}
	
	
	 
}

E o MensageBean que uso para retornar o nome de usuário:

package manager;

import java.io.Serializable;

import javax.faces.bean.SessionScoped;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;

import entity.Usuario;
@SessionScoped
public class UsuarioController implements Serializable { 
	      
	private static final long serialVersionUID = 1L;
		private Usuario usuario;  
		
	    public UsuarioController(){  
	        usuario = new Usuario();  
	        SecurityContext context = SecurityContextHolder.getContext();  
	        if(context instanceof SecurityContext)  
	        {  
	            Authentication authentication = context.getAuthentication();  
	            if(authentication instanceof Authentication)  
	            {  
	                 usuario.setUsername(((User)authentication.getPrincipal()).getUsername());
	            }  
	        }  
	          
	    }  
	  
	    public Usuario getUsuario() {  
	        return usuario;  
	    }  
	  
	    public void setUsuario(Usuario usuario) {  
	        this.usuario = usuario;  
	    }  
	    
	    /**public void pegaIdUsuario(){  
	        usuario = new Usuario();  
	       usuario.getIdusuario();
	          
	    }**/
	
}

Por favor, se puderem me ajudar, eu agradeço imensamente!

5 Respostas

prog.tiago

Boa tarde,

Você quer recuperar o usuário logado através do Spring Security? Não entendi muito bem qual eh a sua dúvida.

ViniGodoy

Por favor, ao postar tópicos, não coloque expressões como SOCORRO ou URGENTE no título, ou implore por ajuda.
É considerado falta de etiqueta tentar se priorizar sobre os outros membros do fórum.

Seu post foi editado para remover o tom de urgência.

DiogoLPJ

É por ai generalizando, Tiago!

Estou tentando resgatar o id do usuário logado para poder setar a foreign key da tabela(classe) mensagem. Dessa forma eu ligo as mensagens ao usuário que as escreve.

Eu estava tentando fazer alguma coisa como isso aqui no MensagemDao:

public void create(Mensagem m, Usuario u) throws Exception{
	   session = HibernateUtil.getSessionFactory().openSession();
	   transaction = session.beginTransaction();
                        m.setNick(u.getUsername());
                        m.setUsuario(u) --> setando o id do usuário também
	   		session.save(m);
	   transaction.commit();
	   session.close();  
	  }

Mas quando testei, estava vindo tudo nulo…o que me fez chegar a conclusão que precisaria resgatar dados da sessão criada pelo Spring dnovo, como fiz para pegar o nome do usuário:

package manager;

import java.io.Serializable;

import javax.faces.bean.SessionScoped;
import javax.persistence.Query;

import org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;

import entity.Usuario;
@SessionScoped
public class UsuarioController implements Serializable { 
	      
	private static final long serialVersionUID = 1L;
		private Usuario usuario;  
		
	    public UsuarioController(){  
	        usuario = new Usuario();  
	        SecurityContext context = SecurityContextHolder.getContext();  
	        if(context instanceof SecurityContext)  
	        {  
	            Authentication authentication = context.getAuthentication();  
	            if(authentication instanceof Authentication)  
	            {  
	                 usuario.setUsername(((User)authentication.getPrincipal()).getUsername());
	            }  
	        }  
	          
	    }  
	  
	    public Usuario getUsuario() {  
	        return usuario;  
	    }  
	  
	    public void setUsuario(Usuario usuario) {  
	        this.usuario = usuario;  
	    }  
	
}

Mas não achei nenhum método para pegar o Id implementado no authentication do Spring security…então fiquei perdido…

DiogoLPJ

ViniGodoy:
Por favor, ao postar tópicos, não coloque expressões como SOCORRO ou URGENTE no título, ou implore por ajuda.
É considerado falta de etiqueta tentar se priorizar sobre os outros membros do fórum.

Seu post foi editado para remover o tom de urgência.

Obrigado por avisar ViniGodoy.

Peço desculpas.

DiogoLPJ

Se alguém puder ajudar, por favor…

Já tentei com tanta coisa que não tenho mais ideias rsrs…

Até POGs são bem vindas a essa altura do campeonato aHHahAHHa…Já tentei interagir com campos texto invisíveis, mas não dá pra passar o valor a não ser por EL tipo:

<h:inputText value="#{UsuarioController.usuario.username}" />

Mas o botão para proceder com a gravação teria que executar duas ações…o que é inviável até onde sei :?

Estou tentando bolar alguma coisa em javascript…mas não está saindo nada…

Criado 24 de março de 2012
Ultima resposta 24 de mar. de 2012
Respostas 5
Participantes 3