Dúvida com expression languagem + OO + BD

9 respostas
J

Pessoal,

Estou com uma dúvida e não sei nem como pesquisar pra tentar resolver o problema.
Eu tenho uma classe Usuario, que tem um atributo do tipo TipoUsuario. Após salvar meu novo usuário quero mostrar na tela os dados desse novo usuario cadastrado, para isso uso Expression Language. Eu consigo mostrar todos os dados do usuário, acessano a classe Usuario, mas quando tento mostrar o tipo de usuario que foi cadastrado(usuario ou administrador) não consigo, pois eu só consigo acessar o id do tipo (que vem do form html), mas não sei como fazer pra acessar a descrição do tipo de usuário. Se alguem puder me ajudar. Meu codigo está assim:

Usuário: ${usuario.nome}<br /> Login: ${usuario.login}<br /> Senha: ${usuario.senha}<br /> Tipo: ${usuario.tipoUsuario.id}

Se eu colocar ${usuario.tipoUsuario.tipo} nao mostra nada, como faço pra carregar esse tipo com o id que tenho, ou de algum outro jeito? Tenho que acessar o BD direto da minha classe?

9 Respostas

J

Como está sua classe TipoUsuario?

J
Usuario:
@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_usuario")
    private int id;
    
    @Column(name = "nome")
    private String nome;
    
    @Column(name = "login")
    private String login;

    @Column(name = "senha")
    private String senha;
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "id_tipo_usuario", insertable = true, updatable = true)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.PERSIST)
    private TipoUsuario tipoUsuario;
    //getters e setetrs
TipoUsuario:
@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_tipo_usuario")
    private int id;

    @Column(name = "tipo")
    private String tipo;

    @OneToMany(mappedBy="tipoUsuario", fetch = FetchType.LAZY)
    @Cascade(CascadeType.ALL)
    private Collection<Usuario> usuarios;
J

Estranho, EL permite aninhar propriedades.

Exemplo:

public class Pessoa {

String nome;
String sobrenome;
Endereco endereco;

	public Pessoa(String nome, String sobrenome, Endereco endereco) {
		super();
		this.nome = nome;
		this.sobrenome = sobrenome;
		this.endereco = endereco;
	} 

	public String getNome() {
		return nome;
	} 

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

	public String getSobrenome() {
		return sobrenome;
	} 

	public void setSobrenome(String sobrenome) {
		this.sobrenome = sobrenome;
	} 

	public Endereco getEndereco() {
		return endereco;
	} 

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

	private String bairro;
	private String cep;

	public Endereco(String bairro, String cep) {
		super();
		this.bairro = bairro;
		this.cep = cep;
	}

	public String getBairro() {
		return bairro;
	}

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

	public String getCep() {
		return cep;
	}

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

e na página acessar assim:

${pessoa.endereco.cep}
J
O problema deve estar na minha action do Struts entao. Porque eu consigo setar o id do TipoUsuario, pois vem atraves do form html, mas nao o tipo. Eu tentei fazer isso na ação do Strus, pegando do BD, mas da erro. Minha action esta assim:
Usuario usuario = new Usuario();
        usuario.setNome(usuarioForm.getNome());
        usuario.setLogin(usuarioForm.getLogin());
        usuario.setSenha(usuarioForm.getSenha());
             
        TipoUsuario tipoUsuario = new TipoUsuario();
        /*TipoUsuario tipoUsuarioBd = new TipoUsuario();

        TipoUsuarioDAO tipoUsuarioDao = new TipoUsuarioDAO(session, TipoUsuario.class);

        tipoUsuarioBd = tipoUsuarioDao.carregarTipoUsuarioPeloId(usuarioForm.getIdTipoUsuario());
        tipoUsuario.setId(usuarioForm.getIdTipoUsuario());
        tipoUsuario.setTipo(tipoUsuarioBd.getTipo());*/

        tipoUsuario.setId(usuarioForm.getIdTipoUsuario());
        tipoUsuario.setUsuarios(new HashSet<Usuario>());
        tipoUsuario.getUsuarios().add(usuario);

        usuario.setTipoUsuario(tipoUsuario);

        request.setAttribute("usuario", usuario);
TipoUsuarioDAO:
public TipoUsuario carregarTipoUsuarioPeloId(int id) {
        Criteria c = session.createCriteria(TipoUsuario.class);
        c.add(Restrictions.eq("id_tipo_usuario", id));

        return (TipoUsuario) c.uniqueResult();
    }

Eu tenho que fazer isso entao? PEgar a descrição do tipo de usuario, no BD, ja que tenho o id vindo do formulario? O codigo comentado na minha ação me retorna um erro, por isso tentei partir pra outro jeito de fazer isso, vou ver se consigo gerar o erro de novo e coloco aqui.

J

Quando eu tento rodar o codigo comentado acima, pra pegar o TipoUsuario no BD e setar a sua descrição no meu objeto, o erro gerado é esse:

<blockquote>org.hibernate.QueryException: could not resolve property: id_tipo_usuario of: catalogo.modelo.TipoUsuario

org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:44)

org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:38)

org.hibernate.persister.entity.AbstractEntityPersister.getSubclassPropertyTableNumber(AbstractEntityPersister.java:1375)

org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:31)

org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1350)

org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:434)

org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumnsUsingProjection(CriteriaQueryTranslator.java:394)

org.hibernate.criterion.SimpleExpression.toSqlString(SimpleExpression.java:45)

org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:334)

org.hibernate.loader.criteria.CriteriaJoinWalker.(CriteriaJoinWalker.java:82)

org.hibernate.loader.criteria.CriteriaLoader.(CriteriaLoader.java:67)

org.hibernate.impl.SessionImpl.list(SessionImpl.java:1550)

org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)

org.hibernate.impl.CriteriaImpl.uniqueResult(CriteriaImpl.java:305)

catalogo.dao.TipoUsuarioDAO.carregarTipoUsuarioPeloId(TipoUsuarioDAO.java:18)

catalogo.controle.actions.IncluirUsuarioAction.execute(IncluirUsuarioAction.java:48)

org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)

org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)

org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)

org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)

javax.servlet.http.HttpServlet.service(HttpServlet.java:637)

javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

J

Acho que teria que ficar assim:

public TipoUsuario carregarTipoUsuarioPeloId(int id) {
        Criteria c = session.createCriteria(TipoUsuario.class);
        c.add(Restrictions.eq("id", id));

        return (TipoUsuario) c.uniqueResult();
    }
J

Mas na minha tabela está id_tipo_usuario, e nao só id.

J

up

J

É que vc tem que usar o nome dos campos Java e não da tabela.
Na sua classe está id.

Por isso na exception diz que não encontrou a propriedade:

Criado 25 de março de 2010
Ultima resposta 26 de mar. de 2010
Respostas 9
Participantes 2