[RESOLVIDO]Populando objeto com Hibernate

Ola pessoal tudo bem? Mais uma vez venho pedir o auxilio de voces. Continuando meus estudos de Java Web, criei um formulario para cadastrar clientes e estou utilizando hibernate e struts. Estou aprendendo a lidar com eles agora , por isso estou apanhando bastante haha.

Meu problema é : eu criei as tabelas, porem na hora de salvar no banco de dados todos os campos estao sendo preenchidos com null. Eu estou fazendo alguma besteira no código que nao estou enxergando, talvez pelo fato de estar começando a aprender agora.

tenho essa classe cliente:

@Entity
public class Clientes {
	
	private String nome, cnpj , ie,endereco , bairro , cidade , estado, cep , telefone , fax,
    representante,email;
	
	@Id
	@GeneratedValue
	private int cod;
	
	
	public int getCod() {
		return cod;
	}

	public void setCod(int cod) {
		this.cod = cod;
	}

	private String codigo;

	public String getNome() {
		return nome;
	}

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

	public String getCnpj() {
		return cnpj;
	}

	public void setCnpj(String cnpj) {
		this.cnpj = cnpj;
	}

	public String getIe() {
		return ie;
	}

	public void setIe(String ie) {
		this.ie = ie;
	}

	public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	public String getBairro() {
		return bairro;
	}

	public void setBairro(String bairro) {
		this.bairro = bairro;
	}

	public String getCidade() {
		return cidade;
	}

	public void setCidade(String cidade) {
		this.cidade = cidade;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public String getCep() {
		return cep;
	}

	public void setCep(String cep) {
		this.cep = cep;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	public String getFax() {
		return fax;
	}

	public void setFax(String fax) {
		this.fax = fax;
	}

	public String getRepresentante() {
		return representante;
	}

	public void setRepresentante(String representante) {
		this.representante = representante;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}
	  	
}

Na minha action , quero receber os dados do formulario e salvar no banco de dados.

Minha action :

public class CadastrarClienteAction {
	
	private Clientes cliente;

	@Action(value = "Cadastrar", results = {
			@Result(location = "cadastrado.jsp", name = "ok") }
			)
			public String execute() {
			Session session = new HibernateUtils().getSession();
			ClienteDao dao = new ClienteDao(session);
			
			session.beginTransaction();
			dao.salva(cliente);
			session.getTransaction().commit();
			session.close();
				
			return "ok";
			}
	
	public void setCliente(Clientes c) {
		this.cliente= c;
		}
		public Clientes getCLiente() {
		return this.cliente;
		}
}

Dao :

public class ClienteDao {
	
	private Session session;

	public ClienteDao(Session session){
		this.session = session;
	}
	
	public void salva(Clientes c){
		session.save(c);
	}
	
	public void remove(Clientes c ){
		session.delete(c);
	}
	
	public Clientes procura(Long id) {
		return (Clientes) this.session.load(Clientes.class, id);
		}
	
	public void atualiza (Clientes c) {
		this.session.update(c);
		}
}

e finalmente o JSP: ( colocarei apenas o formulario por questão de visualização )


<form action="Cadastrar" method="post">
						<fieldset>
							<label for="nome">Nome:</label>	
							 <input id="nome" type="text" name="cliente.nome" />
							 <label for="ie">IE:</label> <input type="text" id="ie" name="cliente.ie" />
							 <label for="codigo">Código:</label> <input type="text" id="codigo" name="cliente.codigo" /><br />
							 <label for="telefone">Telefone:</label><input type="text" id="telefone" name="cliente.telefone" />
							 <label for="fax">Fax:</label><input type="text" id="fax" name="cliente.fax" /><br />
							 <label for="cnpj">CNPJ:</label> <input type="text" id="cnpj" name="cliente.cnpj" /> 
							 <label for="cep">&nbsp;&nbsp;CEP:</label> <input type="text" id="cep" name="cliente.cep" />
							 <label for="endereco">&nbsp;&nbsp;Endereço:</label> <input type="text" id="endereco" name="cliente.endereco" /><br />
							 <label for="cidade">Cidade:</label> <input type="text" id="cidade" name="cliente.cidade" />
							 <label for="bairro">Bairro:</label> <input type="text" id="bairro" name="cliente.bairro" />
							 <label for="email">Email:</label> <input type="text" id="email" name="cliente.email" /> <br />
						     <label for="estado">Estado:</label> <select id ="estado" name="cliente.estado">
							    		<option>AC</option>
							    		<option>AL</option>
							    		<option>AP</option>
							    		<option>AM</option>
							    		<option>BA</option>
							    		<option>CE</option>
							    		<option>DF</option>
							    		<option>ES</option>
							    		<option>GO</option>
							    		<option>MA</option>
							    		<option>MG</option>
							    		<option>MS</option>
							    		<option>MT</option>
							    		<option>PA</option>
							    		<option>PB</option>
							    		<option>PE</option>
							    		<option>PI</option>
							    		<option>PR</option>
							    		<option>RJ</option>
							    		<option>RN</option>
							    		<option>RO</option>
							    		<option>RR</option>
							    		<option>RS</option>
							    		<option>SC</option>
							    		<option>SE</option>
							    		<option>SP</option>
							    		<option>TO</option>    
						    		</select>
						    		 <label for="representante">Representante:</label> <input type="text" id="representante" name="cliente.representante" /><br />
						    		<br />
						    
							<input type="submit" id="enviar" value="Salvar" /> <input id="limpar" type="reset" value="Limpar" />
							<input type="hidden" id="cadastro" name="Logica" value="cadastrarcliente" /> 
						</fieldset>
					</form>	

Por favor ,alguem que puder dar uma olhada no meu código e puder me dar umas dicas ou enxergue meu erro , ficarei muito grato.

1 - Prefira criar suas entities implementando a interface Serializable

@Entity  
public class Clientes implements java.io.Serializable { 

2 - Se você tem o DAO, por que inicia a transação e a encerra na Action? Isso tudo é parte da DAO. Aliás, a Actin nem deveria saber que a camada de persistência usa Hibernate, o que é uma Session e que a transação precisa de um beginTransaction e um commit…
3 - Está usando Struts 2, mas, por que não usa as taglibs do Struts 2?

[quote=drsmachado]1 - Prefira criar suas entities implementando a interface Serializable

@Entity  
public class Clientes implements java.io.Serializable { 

2 - Se você tem o DAO, por que inicia a transação e a encerra na Action? Isso tudo é parte da DAO. Aliás, a Actin nem deveria saber que a camada de persistência usa Hibernate, o que é uma Session e que a transação precisa de um beginTransaction e um commit…
3 - Está usando Struts 2, mas, por que não usa as taglibs do Struts 2?[/quote]

drsmachado, muito obrigado por responder. Eu ja imaginava que teria uma porrada de erros conceituais. Estou começando os estudos agora ,e esses erros que cometi é pura falta de conhecimento. Obrigado por mostra-los para mim. Eu estou seguindo a apostila da caelum, e eles fazem as coisas todas separadas. Eles nao mostram por exemplo a utilização conjunta do hibernate e do struts 2. Creio que para fins didaticos mostrar tudo separadamente seja melhor , mas na hora da pratica acabam saindo esses erros de iniciantes.

Sobre as questões que vc levantou :

modifiquei o DAO, e tentei tirar da action a transação. Nao sei se fiz da maneira correta :

public class ClienteDao {
	
	private Session session = new HibernateUtils().getSession();
	
	public void salva(Clientes c){
		session.beginTransaction();
		session.save(c);
		session.getTransaction().commit();
		session.close();
	}
	
	public void remove(Clientes c ){
		session.beginTransaction();
		session.delete(c);
		session.getTransaction().commit();
		session.close();
	}
	
	public Clientes procura(Long id) {
		return (Clientes) this.session.load(Clientes.class, id);
		}
	
	public void atualiza (Clientes c) {
		session.beginTransaction();
		this.session.update(c);
		session.getTransaction().commit();
		session.close();
		}
}

e na action :

public class CadastrarClienteAction {
	
	private Clientes cliente;

	@Action(value = "Cadastrar", results = {
			@Result(location = "cadastrado.jsp", name = "ok") }
			)
			public String execute() {
			ClienteDao dao = new ClienteDao();
			dao.salva(cliente);
			return "ok";
			}
	
	public void setCliente(Clientes c) {
		this.cliente= c;
		}
		public Clientes getCLiente() {
		return this.cliente;
		}
}

Está correto fazer desse jeito?

e sobre as taglibs do struts 2, vc poderia me dizer algumas para eu poder pesquisar mais sobre o assunto?

obrigado

Bom, eu prefiro uma outra abordagem quanto às transactions:

public class ClienteDao {  
      
    private Session session;
    private Transaction tx
    public ClienteDao(){
        session = new HibernateUtils().getSession();  
        tx = session.beginTransaction();
    }  
    
    public void salva(Clientes c){  
        session.save(c);  
        tx.commit();  
        session.close();  
    }  

Percebe?
A parte da Action está bem melhor, com o tempo você vai se acostumando.

Taglibs do Struts 2 podem ser utilizadas assim:
Inclua isso antes do código da JSP

<%@ taglib prefix="s" uri="/tags-struts" %>

E então, poderá utilizar:

<s:a>
<s:textfield>
<s:textarea>
<s:password>(acho que é isso)
<s:hidden>
<s:select>
<s:head/>
<s:button>

E mais alguns

[quote=drsmachado]Bom, eu prefiro uma outra abordagem quanto às transactions:

public class ClienteDao {  
      
    private Session session;
    private Transaction tx
    public ClienteDao(){
        session = new HibernateUtils().getSession();  
        tx = session.beginTransaction();
    }  
    
    public void salva(Clientes c){  
        session.save(c);  
        tx.commit();  
        session.close();  
    }  

Percebe?
A parte da Action está bem melhor, com o tempo você vai se acostumando.

Taglibs do Struts 2 podem ser utilizadas assim:
Inclua isso antes do código da JSP

<%@ taglib prefix="s" uri="/tags-struts" %>

E então, poderá utilizar:

<s:a>
<s:textfield>
<s:textarea>
<s:password>(acho que é isso)
<s:hidden>
<s:select>
<s:head/>
<s:button>

E mais alguns[/quote]

drsmachado obrigado pelas dicas. O começo é sempre o mais dificil. Alguns conceitos ( como esses de session e transaction ) ainda nao estão claros pra mim. Uma coisa curiosa que notei , foi que no meu codigo , disse que todos os atributos estavam sendo gravados como null , porem o atributo “telefone” esta sendo gravado corretamente. Isso me deixou confuso. Voce tem alguma ideia doq pode estar acontecendo? eu revirei o codigo e não consigo achar uma explicação. Pra mim se um funcionou os outros tbm deveriam ter funcionado. ate pq os atributos estão sendo passados para a action do mesmo modo.

Continuando os testes e pesquisas, percebi que na verdade somente a ultima coluna criada no banco de dados está sendo populada, seja ela qual for. Tentei mudar o tipo do input de submit para button tbm nao funcionou. Os valores nao estão sendo passados para a action. O unico valor passado está sendo o da ultima coluna do banco de dados. Caso alguem tenha alguma ideia do q possa estar acontecendo, fico grato

Problema resolvido. Tao imbecil que da até vergonha.

                public Clientes getCLiente() {
		      return this.cliente;
		}

“CLiente”

Tudo por culpa de um L maiusculo. Mano, eu to quase chorando de raiva hahah.