Vraptor - Chave estrangeira

6 respostas
M

Olá, estou estudando o vraptor e comecei a desenvolver um aplicativo.
Cadastro de usuarios ---- departamento.
cada usuário só pode ser lotado em 1 departamento, mas 1 departamento pode ter n usuários.

fiz o adicionar/remover/editar departamento tranquilo.
quando comecei a fazer o cadastro de funcionário que preciso listar todos os departamentos para que o seja escolhido um para lotar o usuário que acabou dando problema.

Não consigo listar os departamentos no form de cadastro de usuário.
Vou colocar meus modelos, logicas e jsp abaixo.
:?

Departamento

package br.com.click.modelo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Departamento {
	
	@Id
	@GeneratedValue
	private Long id;
	private String nome;
	private String descricao;
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	
	
}

Usuario

package br.com.click.modelo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class Usuario {

	@Id
	@GeneratedValue
	private Long id;
	private String nome;
	private String login;
	private String senha;
	
	@ManyToOne
	private Departamento departamento;

	public Long getId() {
		return id;
	}

	public void setId(Long 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 Departamento getDepartamento() {
		return departamento;
	}

	public void setDepartamento(Departamento departamento) {
		this.departamento = departamento;
	}
	
	
	
}

depois mapiei no hibernate.cfg.xml

e rodei a classe gerabanco.

package br.com.click.util;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class GeraBanco {

	public static void main(String[] args) {
		
		Configuration conf = new AnnotationConfiguration();
		conf.configure();
		
		SchemaExport se = new SchemaExport(conf);
		se.create(true, true);
		
	}
}

em seguida criei departamentoLogic

package br.com.click.logic;

import java.util.List;

import org.vraptor.annotations.Component;
import org.vraptor.annotations.InterceptedBy;
import org.vraptor.annotations.Out;

import br.com.click.dao.DaoFactory;
import br.com.click.modelo.Departamento;

@Component("departamento")
@InterceptedBy(DaoInterceptor.class)
public class DepartamentoLogic {
	
	private final DaoFactory daoFactory;
	
	@Out
	private Departamento departamento;
	private List<Departamento> departamentos;
	
	public DepartamentoLogic(DaoFactory daoFactory){
		this.daoFactory = daoFactory;
	}
	
	//formulario de adição
	public void formulario(){
		
	}
	
	public void editar(Departamento departamento) {
		//carrega os dados do banco para edição
		this.departamento = this.daoFactory.getDepartamentoDao().procura(departamento.getId());		
	}
	public void armazena(Departamento departamento) {
		this.daoFactory.beginTransaction();
		this.daoFactory.getDepartamentoDao().atualiza(departamento);
		this.daoFactory.commit();		
	}
	
	public void remove(Departamento departamento) {
		this.daoFactory.beginTransaction();
		this.daoFactory.getDepartamentoDao().remove(departamento);
		this.daoFactory.commit();	
	}
	
	public void lista() {
		this.departamentos = this.daoFactory.getDepartamentoDao().listaTudo();
	}
	
	public Departamento getDepartamento(){
		return departamento;
	}
	
	public List<Departamento> getDepartamentos() {
		return departamentos;
	}
	

}

Até aqui tava tudo funcinando direito…
Adicionando / removendo e editando departamento sem problemas.
Quando passei para a parte de Usuários é que o problema começou.

package br.com.click.logic;

import java.util.List;

import org.vraptor.annotations.Component;
import org.vraptor.annotations.InterceptedBy;
import org.vraptor.annotations.Out;

import br.com.click.dao.DaoFactory;
import br.com.click.modelo.Departamento;
import br.com.click.modelo.Usuario;
@Component("usuario")
@InterceptedBy(DaoInterceptor.class)
public class UsuarioLogic {
	
	private final DaoFactory daoFactory;
	@Out
	private Usuario usuario;
	private List<Usuario> usuarios;
	
	public UsuarioLogic(DaoFactory daoFactory){
		this.daoFactory = daoFactory;
	}
	
	public void formulario(){
		
	}
	public void editar(Usuario usuario) {
		this.usuario = this.daoFactory.getUsuarioDao().procura(usuario.getId());
	}
	//adiciona ou atualiza
	public void armazena(Usuario usuario) {
		this.daoFactory.beginTransaction();
		this.daoFactory.getUsuarioDao().atualiza(usuario);
		this.daoFactory.commit();		
	}
	public void remove(Usuario usuario) {
		this.daoFactory.beginTransaction();
		this.daoFactory.getUsuarioDao().remove(usuario);
		this.daoFactory.commit();
	}
	public void lista() {
		this.usuarios = this.daoFactory.getUsuarioDao().listaTudo();
	
	}
	
	public Usuario getUsuario(){
		return usuario;		
	}
	
	public List<Usuario> getUsuarios() {
		return usuarios;		
	}
	
	//usado para popular o select
	public List<Departamento> getListaDepartamento() {
		return this.daoFactory.getDepartamentoDao().listaTudo();
		
	}
	

}

form.ok.jsp

<form action="usuario.armazena.logic" method="post">
	<fieldset>
		<legend>Dados Cadastrais</legend>
		
		<input type="hidden" name="usuario.id" value="${usuario.id}"/>
		Departamento:
		<select name="usuario.departamento.id">
  			<c:forEach var="departamento" items="${listaDepartamentos}">
    		  <option value="${departamento.id}">${departamento.nome}</option>
  			</c:forEach>
		</select>

	<table>
		<tr>
			<td>Nome:</td>
			<td><input type="text" name="usuario.nome" value="${usuario.nome}" /></td>
		</tr>
		<tr>    
     		<td>Login:</td> 
     		<td><input type="text" name="usuario.login" value="${usuario.login}" /></td>
     	</tr>
     	<tr>
      	<td>Senha:</td>
      	<td><input type="password" name="usuario.senha" /></td>
      </tr>
      <tr>
      	<td></td>                                             
         <td><input type="submit" /></td>
      </tr>
 	</fieldset>
   </table>
   
 </form>

O formulario roda, sem dar erro nenhum, mas a caixa de seleção que era pra conter os departamentos vem vazia.
Se adiciono um usuario ele fica sem departamento.

Alguem tem idéia de onde eu deslizei?
Abraço.
Obrigado.

6 Respostas

jvlouvem

Olá, cara não percebi que tbm nao listava os departamentos, pensei que voce nao estava era conseguindo associar com o usuario,

faça essas mudanças

@Out
private List<Departamento> departamentos;

e

<c:forEach var="departamento" items="${departamentos}">

depois me diz se pelo menos listou os departamentos, depois vamos ver como eles vao ser associados que é a parte mais complexa

jvlouvem

OBS: O fluxo tem que ser o seguinte: clica em algum lugar da pagina para chamar a logic essa logic preenche a variavel departamentos e depois chama sua jsp, no caso a variavel departamentos só esta declarada em DepartamentoLogic, é lá mesmo que redireciona para aquela JSP ? Se o redirecionamento for através de UsuarioLogic, esse vai precisar de um list de departamentos exatamente como esta na classe DepartamentoLogic

M

fiz as modificações e n funcionaram…
Tem o getListaDepartamentos(); na usuarioLogic.
Tem que chamar ela para depois chamar a usuario.formulario.logic?

jvlouvem

Esse metodo esta sendo usado como action ?

//usado para popular o select  
 public List<Departamento> getListaDepartamento() {  
   return this.daoFactory.getDepartamentoDao().listaTudo();  
           
 }

Nem cheguei a testar assim, mas acho que as actions são declaradas como void ou com retorno String.

O que voce precisa é declarar na classe usuario UsuarioLogic:

@Out
private List<Departamento> departamentos;

feito isso deve haver uma action que dentro dela voce atribua:

public String minhaAction() {
   departamentos =  dao.getDepartamentos();

return "forward_para_a_jsp_onde_esta_select_de_departamentos"
}
A

Tenta ao invés de ${listaDepartamentos} colocar ${listaDepartamento} já que seu metodo chama getListaDepartamento

Alberto

M

Era isso mesmo alberto, foi só tirar o s e tudo funcionou.
Muito obrigado!
Obrigado jvlouvem por ajudar tbm.
abraços…
:wink:

Criado 7 de abril de 2009
Ultima resposta 7 de abr. de 2009
Respostas 6
Participantes 3