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

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!

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.

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.

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

[quote=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.[/quote]

Obrigado por avisar ViniGodoy.

Peço desculpas.

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…