Como posso gravar no banco um valor "fixo"? JAVA Spring + Hibernate + JSF

Sei que isso pode ser uma pergunta meio boba, mas se alguém puder me ajudar, eu agradeço…

Como posso inserir um valor fixo, mas que varie de acordo com um atributo , no atributo da classe visando adiciona-lo no banco de dados também?

Essa pergunta estranha é pq estou tentando inserir o valor do username do usuário logado na tabela de mensagens.

Só estou conseguindo resgatar o username dessa forma: “#{UsuarioController.usuario.username}”, pois usei uma classe MB indicada aqui mesmo:


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

Desde já, obrigado!!!

Explica melhor.

explique melhor!

Fala pessoal!

Desculpem se não me expressei bem…é que preciso dizer pro sisteminha que o nick dele sempre será o username do contexto ativo.

Deu pra entender aí?

Tipo, usei Spring Security para logar; Loguei, ele pega o nome do usuário, e grava no banco de mensagens como sendo o nick dele…

Abraços e obrigado!!!

Você quer recuperar o este valor do usuário dentro das suas classes. assim vc irá atribuir o “nome do usuário logado” à alguma propriedade sua!?
É isso que voce quer?

UsuarioController usuarioUtil = new UsuarioController();

this.minhaClasse.setUsuario(usarioUtil.usuario.getUserName());

se não for isto, tmb não entendi sua pergunta!

abs

[quote=rfagalde]Você quer recuperar o este valor do usuário dentro das suas classes. assim vc irá atribuir o “nome do usuário logado” à alguma propriedade sua!?
É isso que voce quer?

UsuarioController usuarioUtil = new UsuarioController();

this.minhaClasse.setUsuario(usarioUtil.usuario.getUserName());

se não for isto, tmb não entendi sua pergunta!

abs

[/quote]

Fala rfagalde!!

Obrigado pela ajuda!

Acho que é bem por aí sim! Não estou muito familiarizado com as nomenclaturas, mas vou explicar da melhor maneira possível:

Coloquei uma tela de login. Então o usuário loga (os dados de usuário estão numa tabela usuário). Quando o usuário está logado, ele tem acesso a um modelo de CHAT bem rudimentar que grava as mensagens numa tabela chamada mensagem, junto com os dados que definem qual usuário enviou. O dado principal que define o usuário na tabela mensagem é o ID do usuário, e seu Nick (nickname usado em chats).
A primeira coisa que estou tendo dificuldade é em realizar a gravação desse nick(username da tabela usuário) na tabela mensagem (aqui, chamado de nick) sempre usando o username do usuário que logou.

Acho que o que vc postou resolveria o problema…mas estou vendo aonde vou encaixar o código e adapta-lo @__@…tentei coloca-lo no set ou get do nick na classe Mensagem, mas não estou sendo muito feliz…ele reclama da visibilidade do objeto usuario.

Obrigado de novo!!!

Olá DiogoLPJ.

A sua dificuldade está no mapeamento que você está fazendo entre a sua entidade que irá armazenar os registros das conversas associado ao usuário que a postou!
É isto?

abs!

[quote=rfagalde]Olá DiogoLPJ.

A sua dificuldade está no mapeamento que você está fazendo entre a sua entidade que irá armazenar os registros das conversas associado ao usuário que a postou!
É isto?

abs![/quote]

Falaaa rfagalde!!!

Acho que resumindo pode ser isso sim! rsrs

Antes, eu peguei o sisteminha, e o usuário tinha que digitar o nome dele. Então ele pegava o que ele digitou e gravava no banco. No frame de visualização de mensagens, eu só fiz resgatar alguns campos da tabela mensagem, e como era em tempo real, eu só pedi pra ele atualizar de 5 em 5 segundos.
Mas agora que integrei um sisteminha de login usando o spring security nele, minha ideia é que o usuário não precise mais escrever seu nome para enviar as mensagens. Ele só digite a mensagem, e ao clicar em enviar, o sistema já grave automaticamente o nome dele como seu username. Dessa forma, ao resgatar a tabela mensagem, vai aparecer lá o username do cidadão, seguido de sua mensagem.

Vou postar um pouco do código:

Mensagem:

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;

import manager.UsuarioController;

@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;
		UsuarioController usuarioUtil = new UsuarioController();
		return (this.mensagem.setUsuario(usuarioUtil.usuario.getUserName()));
	}

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

}

MensagemDao

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

Acho que esses são os mais interessantes a se ressaltar…qualquer coisa, me fala que eu posto algo em específico que ainda não postei sem nenhum problema.

Obrigadão pela paciência e pelas respostas rápidas! :slight_smile:

Olá DiogoLPJ.

Eu não construiria desta forma; Acredito que para você resolver a sua questão você irá recuperar o Objeto Usuario da forma que falei acima em alguma classe que representa o seu Servlet/ManagedBean.

Ou seja, nesta tela que o usuário faz o “submit”, este “submit” é enviado para um “Servlet” ou algum tipo de classe Web.

Nesta classe vc recupera o Objeto Usuario e faz a persistência normal, não tivemos interação do usuário para digitar nada!

É isto?

abs!

[quote=rfagalde]Olá DiogoLPJ.

Eu não construiria desta forma; Acredito que para você resolver a sua questão você irá recuperar o Objeto Usuario da forma que falei acima em alguma classe que representa o seu Servlet/ManagedBean.

Ou seja, nesta tela que o usuário faz o “submit”, este “submit” é enviado para um “Servlet” ou algum tipo de classe Web.

Nesta classe vc recupera o Objeto Usuario e faz a persistência normal, não tivemos interação do usuário para digitar nada!

É isto?

abs![/quote]

Blz rfagalde! Obrigadão pela atenção!

Estou saindo do trabalho. Mais tarde chego em casa e continuo minha saga. Mas vou postar os resultados aqui, com certeza!

Um grande abraço!

[quote=DiogoLPJ][quote=rfagalde]Olá DiogoLPJ.

Eu não construiria desta forma; Acredito que para você resolver a sua questão você irá recuperar o Objeto Usuario da forma que falei acima em alguma classe que representa o seu Servlet/ManagedBean.

Ou seja, nesta tela que o usuário faz o “submit”, este “submit” é enviado para um “Servlet” ou algum tipo de classe Web.

Nesta classe vc recupera o Objeto Usuario e faz a persistência normal, não tivemos interação do usuário para digitar nada!

É isto?

abs![/quote]

Blz rfagalde! Obrigadão pela atenção!

Estou saindo do trabalho. Mais tarde chego em casa e continuo minha saga. Mas vou postar os resultados aqui, com certeza!

Um grande abraço![/quote]

Fala rfagalde e pessoal que acessa o Forum!

Estou tentando adaptar o modelo que vc postou no sisteminha aqui. A pouco tempo que pesquei sua dica, e realmente é o que eu preciso.

Consegui fazer uma doidera aqui, e com isso gravei o nick name (username) do usuario no banco. Com isso ele exibiu o nome do bendito na tabela de mensagens do “chat”.

Olha aí o jeito que dei:

Na classe ManagerBeanMensagem, dentro do método que uso no botão para enviar as mensagens coloquei o código:

UsuarioController uc = new UsuarioController();

this.mensagem.setNick(uc.getUsuario().getUsername());

Mas o problema é que com isso eu forcei a gravação de um dado no banco, certo? Parece que eu criei um objeto mensagem e usuário completos, só com o atributo Nick preenchido, e depois gravei o valor de seu atributo Nick no atributo Nick do objeto de mensagem criado no contexto atual.

Agora estou tentando fazer o seguinte…recuperar o objeto “usuario” que contenha o mesmo “nick” do usuário logado do banco de dados, e com isso poder preencher o que falta no objeto “mensagem” gravado a cada clique no botão “enviar”.

Alguém se habilita a me dar ao menos uma dica? Rsrs O negócio é que a maioria dos artigos que vejo aqui na net o pessoal recupera dados com JDBC, e eu estou usando o Hibernate.

Desde já agradeço pela ajuda, rfagalde! raf4ever e mmanfio, também agradeço, pq pelo menos pediram pra explicar melhor XD~~ flodadores! Rsrs

Abraços!

Falaaaaaaa,

Acho que achei a solução…creio que agora só falta resgatar o objeto “usuario” que está logado para poder relacionar. Alguém pode me ajudar?

Eu estou tentando trazer esse usuário com esse método:


	public Usuario findByUsername(String username){
		
		UsuarioController uc = new UsuarioController();//Classe que pegou o Username do usuário
		
		Usuario userx = new Usuario();
		try {
			userx =(Usuario) 

this.session.createCriteria(Usuario.class).add(Restrictions.eq

("username", uc.getUsuario().getUsername() ));
		} catch (Exception e) {
			e.getMessage();
		}
		
		return userx;
	}

Mas debugando pelo eclipse, percebi o pq nada é gravado…pq ele não traz nada mesmo rsrs…null geral!!!

O que estou fazendo de errado?!

Um grande abraço!

Oi pessoal,

Minha saga continua…

Ainda pouco tentei resgatar o objeto com um método novo que criei aqui…mas o objeto usuário “u” continua aparecendo null no debug…e acaba que não grava nada no DB…na verdade não chega nem na instrução seguinte, que deveria limpar a área de mensagens…

Ai está o código no MensagemDao:


String uc = (String) new UsuarioController().getUsuario().getUsername();
	
	  public Usuario buscaUsuario() throws Exception{
	  session = HibernateUtil.getSessionFactory().openSession();
	  Query query = session.createQuery("select u from Usuario as u where u.nick =:parametro");
	  query.setParameter("parametro", uc);
	  Usuario usr = (Usuario) query.list();
	  session.close();
	  return usr;
	  }
	  
	
	 public void create(Mensagem m, Usuario u) throws Exception{
	   session = HibernateUtil.getSessionFactory().openSession();
	   transaction = session.beginTransaction();
	   
	   //PRECISO PREENCHER O U COM O USUARIO QUE ESTÁ LOGADO E CADASTRADO NO BD
	   
	   u = this.buscaUsuario();
	   
	   m.setUsuario(u);
	   
	   session.save(m);
	   transaction.commit();
	   session.close();  
	  }

Alguém pode me socorrer, por favor? rsrs

Abraços!

Oi pessoal,

Consegui consertar as tabelas no banco de dados, eu tinha posto um @FetchMode.JOIN desnecessário na classe Mensagem e não tinha mapeado a chave da classe Usuario direito…mas agora está redondinho!

Todavia, continuo no embate para recuperar o usuário através de seu nick name…mas se alguém tiver algum modo melhor, que recupere o usuário sem necessitar do nick, estou aberto para conselhos rsrs…

Testei consultas de maneiras diferentes e fui inspecionando o resultado dos objetos através do debug sempre depois da operação…e nada!!! O usuário “u” sempre me retorna nulo! Alguém para me socorrer, por favor?

Segue o código das consultas:


package persistence;

import java.util.List;

import manager.UsuarioController;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;

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

	Session session;
	Transaction transaction;
	Query query;
	
	String uc = (String) new UsuarioController().getUsuario().getUsername();
	
	  /**Método 1 - public Usuario buscaUsuario() throws Exception{
	  session = HibernateUtil.getSessionFactory().openSession();
	  Query query = session.createQuery("select u from Usuario as u where u.nick =:parametro");
	  query.setParameter("parametro", uc);
	  Usuario usr = (Usuario) query.list();
	  session.close();
	  return usr;
	  }
	
	Método 2 - public Usuario buscaUsuario(String uc){
		session = HibernateUtil.getSessionFactory().getCurrentSession();
		Query query = session.createQuery("From Estado where idusuario= :n");
		Usuario userx = (Usuario) query.setParameter("uc", uc).uniqueResult();
		
		return userx;
	}**/
	  
	
	 public void create(Mensagem m, Usuario u) throws Exception{
	   session = HibernateUtil.getSessionFactory().openSession();
	   transaction = session.beginTransaction();
	   
	   //PRECISO PREENCHER O U COM O USUARIO QUE ESTÁ LOGADO E CADASTRADO NO BD
	   
           //Resultado Método 1 - u = this.buscaUsuario();
	   //Resultado Método 2 - u = this.buscaUsuario(uc);
	   
	   //Método direto - u = (Usuario) session.createCriteria(Usuario.class).add(Restrictions.eqProperty("nick", uc)).uniqueResult();
	   
	   m.setUsuario(u);
	   
	   session.save(m);
	   transaction.commit();
	   session.close();  
	  }

NENHUM deles deu certo…e conferi o objeto “uc”, e ele realmente está preenchido com o valor do username…
Alguém me helpa!

Abraços!

Eu esqueci rsrs…o problema do título do tópico já foi resolvido XD~~ Então eu vou abrir outro com o nome do meu outro problema! Obrigadão pessoal!