Problema para recuperar objeto usando Spring+Jsf + hibernateTemplate

7 respostas
nilopadilha

Bom dia pessoal,

Bem passei por alguns probleminhas fazendo essa aplicação mais agora ela já esta quase pronta, mas ainda existe uma coisa que não consigo resolver, não estou conseguindo recuperar o objeto, para vincular o objeto pergunta com as alternativas que é uma lista de alternativas que eu vou ter para cada questão cadastrada no banco.
segue abaixo o meu código.

Classe alternativa

package br.gera.quiz.dominio;



import java.io.Serializable;


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;

@Entity
@Table(name = "alternativa")
public class Alternativa implements Serializable {


	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private long id;
	private String descricao;

	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "id_pergunta", referencedColumnName="id")
	private Pergunta pergunta;

	public Alternativa() {

	}

	public Alternativa(long id, String descricao) {
		this.id = id;
		this.descricao = descricao;

	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Pergunta getPergunta() {
		return pergunta;
	}

	public void setPergunta(Pergunta pergunta) {
		this.pergunta = pergunta;
	}

}

classe pergunta

package br.gera.quiz.dominio;

import java.io.Serializable;
import java.util.Collection;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "pergunta")
public class Pergunta implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private long id;

	private String descricao;

	@OneToMany(mappedBy="pergunta")
	private Collection<Alternativa> alternativas;


	public Pergunta() {

	}

	public Pergunta(long id, String descricao) {
		this.id = id;
		this.descricao = descricao;
		
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Collection<Alternativa> getAlternativas() {
		return alternativas;
	}

	public void setAlternativas(Collection<Alternativa> alternativas) {
		this.alternativas = alternativas;
	}

	

}

alternativaDao

package br.gera.quiz.dados;

import java.util.List;

import br.gera.quiz.dominio.Alternativa;


public interface AlternativaDao {
	
	List<Alternativa> buscarTodos();
	
	List<Alternativa> buscarporid(long id);

	void salvar(Alternativa alternativa);

	void remover(Alternativa alternativa);

}

perguntaDao

package br.gera.quiz.dados;

import java.util.List;


import br.gera.quiz.dominio.Pergunta;

public interface PerguntaDao {

	List<Pergunta> buscarTodos();

	List<Pergunta> buscarporid(long id);

	void salvar(Pergunta pergunta);

	void remover(Pergunta pergunta);

}

Abstractdao

package br.gera.quiz.dados.impl;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import javax.inject.Inject;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateTemplate;

public abstract class AbstractDAO<T>  {

	@Inject
	private HibernateTemplate ht;
	
	public void salvar(T obj) {
		ht.saveOrUpdate(obj);
	}

	public void remover(T obj) {
		ht.delete(obj);
	}

	@SuppressWarnings("unchecked")
	public List<T> buscarTodos() {
		ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
		Type param = type.getActualTypeArguments()[0];
		return ht.loadAll((Class<T>) param);
	}
	
	@SuppressWarnings("unchecked")
    public List<T> buscarporid(long id) {
        ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
        Type param = type.getActualTypeArguments()[0];

        DetachedCriteria criteria = DetachedCriteria.forClass((Class<T>) param);
        criteria.add(Restrictions.idEq(id));
        List<T> results = ht.findByCriteria(criteria);
        return results;

	}
}

altenativaDaoImpl

package br.gera.quiz.dados.impl;

import org.springframework.stereotype.Component;

import br.gera.quiz.dados.AlternativaDao;
import br.gera.quiz.dominio.Alternativa;


@Component
public class AlternativaDaoImpl extends AbstractDAO<Alternativa> implements AlternativaDao {
	

}

perguntaDAOIMPL

package br.gera.quiz.dados.impl;

import org.springframework.stereotype.Component;

import br.gera.quiz.dados.PerguntaDao;
import br.gera.quiz.dominio.Pergunta;

@Component
public class PerguntaDaoImpl extends AbstractDAO<Pergunta> implements PerguntaDao {

	

}

SpringConfig

package br.gera.quiz.escopo;

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.config.CustomScopeConfigurer;
import org.springframework.context.annotation.Bean;

public class SpringConfig {

	@Bean
	public CustomScopeConfigurer escoposPersonalizados() {
		CustomScopeConfigurer c = new CustomScopeConfigurer();
		
		Map<String, Object> escopos = new HashMap<String, Object>();
		escopos.put("view", new ViewScope());
		
		c.setScopes(escopos);
		
		return c;
	}
	
}

Viewscope

package br.gera.quiz.escopo;

import java.util.Map;
import javax.faces.context.FacesContext;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.config.Scope;

public class ViewScope implements Scope {

	public Object get(String name, ObjectFactory<?> objectFactory) {
		Map<String, Object> viewMap = FacesContext.getCurrentInstance()
				.getViewRoot().getViewMap();

		if (viewMap.containsKey(name)) {
			return viewMap.get(name);
		} else {
			Object object = objectFactory.getObject();
			viewMap.put(name, object);
			return object;
		}
	}

	public Object remove(String name) {
		return FacesContext.getCurrentInstance().getViewRoot().getViewMap()
				.remove(name);
	}

	public String getConversationId() {
		return null;
	}

	public void registerDestructionCallback(String name, Runnable callback) {

	}

	public Object resolveContextualObject(String name) {
		return null;
	}

}

GerenciadorPerguntas

package br.gera.quiz.negocio;

import java.util.List;



import br.gera.quiz.dominio.Pergunta;

public interface GerenciadorPerguntas {
	
	List<Pergunta> buscarTodos();
	
	List<Pergunta> buscarporid(long id);
	
	void remover(Pergunta pergunta);

	void salvar(Pergunta pergunta);
	

}

gerenciadorAlternativas

package br.gera.quiz.negocio;

import java.util.List;

import br.gera.quiz.dominio.Alternativa;


public interface GerenciadorAlternativa {

	List<Alternativa> buscarTodos();

	List<Alternativa> buscarporid(long id);

	void salvar(Alternativa alternativa);

	void remover(Alternativa alternativa);
}

GerenciadorPerguntaImpl

package br.gera.quiz.negocio.Impl;

import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Component;
import br.gera.quiz.dados.PerguntaDao;
import br.gera.quiz.dominio.Pergunta;
import br.gera.quiz.negocio.GerenciadorPerguntas;

@Component
public class GerenciadorPerguntaImpl implements GerenciadorPerguntas {

	@Inject
	private PerguntaDao dao;

	@Override
	public List<Pergunta> buscarTodos() {
		// TODO Auto-generated method stub
		return dao.buscarTodos();
	}

	@Override
	public List<Pergunta> buscarporid(long id) {
		// TODO Auto-generated method stub
		return dao.buscarporid(id);
	}

	@Override
	public void remover(Pergunta pergunta) {
		dao.remover(pergunta);
		
	}

	@Override
	public void salvar(Pergunta pergunta) {
		
		dao.salvar(pergunta);
		
	}


	

}

gerenciadorAlternativasIMP

package br.gera.quiz.negocio.Impl;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Component;

import br.gera.quiz.dados.AlternativaDao;
import br.gera.quiz.dominio.Alternativa;
import br.gera.quiz.negocio.GerenciadorAlternativa;

@Component
public class GerenciamentoAlternativaImpl implements GerenciadorAlternativa {

	@Inject
	private AlternativaDao dao;

	@Override
	public List<Alternativa> buscarTodos() {
		
		return dao.buscarTodos();
	}

	@Override
	public List<Alternativa> buscarporid(long id) {
		// TODO Auto-generated method stub
		return dao.buscarporid(id);
	}

	@Override
	public void salvar(Alternativa alternativa) {
		dao.salvar(alternativa);
		
	}

	@Override
	public void remover(Alternativa alternativa) {
		dao.remover(alternativa);
		
	}
	

}

perguntaMBEAN

package br.gera.quiz.Apresentacao;

import java.io.Serializable;
import javax.faces.model.ListDataModel;
import javax.inject.Inject;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.gera.quiz.dominio.Pergunta;
import br.gera.quiz.negocio.GerenciadorPerguntas;

@Component
@Scope("view")
public class PerguntaMBean implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Inject
	private GerenciadorPerguntas gerenciador;
	

	private Pergunta pergunta = new Pergunta();
	

	private ListDataModel<Pergunta> perguntas;
	

	public String salvar() {
		gerenciador.salvar(pergunta);
		return "lista";

	}

	public String remover() {
		pergunta = perguntas.getRowData();
		gerenciador.remover(pergunta);
		return null;
	}

	public ListDataModel<Pergunta> getPerguntas() {
		perguntas = new ListDataModel<Pergunta>(gerenciador.buscarTodos());
		return perguntas;
	}

	public Pergunta getPergunta() {
		return pergunta;
	}

	public void setPergunta(Pergunta pergunta) {
		this.pergunta = pergunta;
	}

	public void setPerguntas(ListDataModel<Pergunta> perguntas) {
		this.perguntas = perguntas;
	}

	
}

AlternativaMbean

package br.gera.quiz.Apresentacao;



import javax.faces.model.ListDataModel;
import javax.inject.Inject;



import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.gera.quiz.dominio.Alternativa;
import br.gera.quiz.negocio.GerenciadorAlternativa;

@Component
@Scope("view")
public class AlternativaMBean  {
	
	
	@Inject
	private GerenciadorAlternativa gerenciador;
	
	private Alternativa alternativa = new Alternativa();
	
	
	private ListDataModel<Alternativa> alternativas;

	
	public String salvar() {
		gerenciador.salvar(alternativa);		
		return "testelista";
	}

	
	public String remover() {
		alternativa = alternativas.getRowData();
		gerenciador.remover(alternativa);
		return null;
	}

	public ListDataModel<Alternativa> getAlternativas() {
		alternativas = new ListDataModel<Alternativa>(gerenciador.buscarTodos());
		return alternativas;
	}

	public Alternativa getAlternativa() {
		return alternativa;
	}

	public void setAlternativa(Alternativa alternativa) {
		this.alternativa = alternativa;
	}

	public void setAlternativas(ListDataModel<Alternativa> alternativas) {
		this.alternativas = alternativas;
	}

	
	
}

Formulários: Aqui nos formulários, queria saber se teria como no momento em que vou lista, poder fazer um select que mostrasse a pergunta com suas devidas alternativas?

form

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets">


<h:form>	
		Descrição: <h:inputText id="descricao"
		value="#{ perguntaMBean.pergunta.descricao }" />

	<br />

	<h:inputHidden value="#{ perguntaMBean.pergunta.id }" />

	<h:commandButton value="Salvar" action="#{ perguntaMBean.salvar() }" />
	
	</h:form>


</html>

lista

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets">

<a href="form.jsf">Cadastrar nova Pergunta</a>

<br />

<h:form>

	<h:dataTable value="#{perguntaMBean.perguntas}" var="e">

		<h:column>
			<f:facet name="header">id</f:facet>
			#{ e.id }
		</h:column>

		<h:column>
			<f:facet name="header">descricao</f:facet>
			#{ e.descricao }
		</h:column>
		
		<h:column>
			<h:commandButton value="Remover" action="#{ perguntaMBean.remover }" />
		</h:column>

	</h:dataTable>
</h:form>
<a href="teste.jsf">Cadastrar respostas</a>

<br />
<h:form>

	<h:dataTable value="#{alternativaMBean.alternativas}" var="r">

		<h:column>
			<f:facet name="header">id</f:facet>
			#{ r.id }
		</h:column>

		<h:column>
			<f:facet name="header">descricao</f:facet>
			#{ r.descricao }
		</h:column>
		<h:column>
			<f:facet name="header">pergunta</f:facet>
			#{ r.pergunta }
		</h:column>
		
		<h:column>
			<h:commandButton value="Remover" action="#{ alternativaMBean.removerAlter }" />
		</h:column>

	</h:dataTable>
</h:form>
</html>

formAlter

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets">


<h:form>

	Respostas:<h:inputText id="descricao"
		value="#{ alternativaMBean.alternativa.descricao}" /> <br />
    
	
	
	<h:inputHidden value="#{ alternativaMBean.alternativa.id }" />



	<h:commandButton value="Salvar" action="#{ alternativaMBean.salvar() }" />
	<a href="lista.jsf">Listar</a>

</h:form>


</html>

7 Respostas

drsmachado

Precisa de todo este código? Sinceramente, nem li.
De onde este objeto deve ser obtido?
Em que ponto você tenta obtê-lo?

Hebert_Coelho

drsmachado:
Precisa de todo este código? Sinceramente, nem li.
De onde este objeto deve ser obtido?
Em que ponto você tenta obtê-lo?
+1 em tudo

nilopadilha

postei o que eu tinha para que vissem com está o código para que outras pessoas que venham ter a mesma duvida que eu não apenhem tanto como eu apanhei.
Queria poder vincular a classe pergunta com a classe alternativa, da forma que esta não faz isso, só consigo inserir objetos dentro de pergunta e alternativas, mas não consigo colocar um objeto alternativa para pergunta.

tentei fazer algo do tipo dentro do dao.

dao.salvar(pergunta);

for (Alternativa alternativa : alternativas) {

alternativa.setPergunta(pergunta);

dao.salvar(alternativa);

}

mais isso não deu certo tambén

nilopadilha

e ai pessoal alguêm?

drsmachado

Você disse, no tópico original, que está com problemas para recuperar. No outro, coloca um trecho de código que faz um insert. Além do exagero de código (quase postou a aplicação toda). Sinceramente, nem perdi tempo procurando e não o farei.
Dois detalhes, seja específico, diga onde está o problema, o que é o problema, se existe erro, exception, se não acontece nada.
O segundo é não exigir do pessoal pressa. Lembre-se ninguém ganha nada com isso aqui, cada resposta exige que o problema seja analisado, em um contexto diferente do teu. A maioria trabalha, precisa pagar as contas no fim do mês. Se você quiser uma solução rápida, sugiro pagar alguém que já saiba ou estudar e aprender. Não se ofenda, mas é preciso entender que o bom funcionamento do guj requer isto. Nem você, nem eu, nem o ViniGodoy terá tratamento especial por ser quem é. Ao menos aqui.

nilopadilha

Caramba drsmachado!!! Acho que você não viu ou se viu não leu o meu post anterior, aprendi na minha vida a compartilhar meu conhecimento, e não desdenhar dos que sabem menos, sempre compartilhei meu conhecimento com meus amigos e tento fazer isso aqui nesse fórum, os problemas que tive anteriormente podem ser os mesmo de outros que virão, trabalho da mesma forma que você.
Se você é muito ocupado, tudo bem, não precisar responder não , pode ficar cultivando seu ego.

E mais uma vez vou colocar minha dúvida para quem esteja disponível a me ajudar:

Queria poder vincular a classe pergunta com a classe alternativa, da forma que esta não faz isso, só consigo inserir objetos dentro de pergunta e alternativas, mas não consigo colocar um objeto alternativa para pergunta. não sei se isso pode ser feito no dao ou no próprio bean, pois eu queria que existisse um cadastro onde cada pergunta tivesse suas respectivas alternativas.

drsmachado

Opa, agora sim temos algo inteligente aqui: estar disponível é diferente de “me respondam agora!”.
Aliás, se tivesse sido direto em tua dúvida, não teria a necessidade de tudo isso.
Primeiro, você definiu o fetch, mas não o cascade.
Sem cascade o Hibernate deixa por tua conta e risco a opção de efetuar ou não a persistência de propriedades que compõem a principal.
Ou seja, se você definir, para a annotation @OneToMany um cascade=CascadeType.ALL (PERSIST, se não me engano é essa), você já resolve o problema.

P.S.: Como eu disse na resposta anterior, quem você é ou deixa de ser e como vive ou viver não me importa. Trato a todos da mesma maneira. Se você é delicado demais para ouvir umas verdades, não tenho nada a ver com isso, eu sou sincero e digo o que penso.

Criado 14 de junho de 2012
Ultima resposta 15 de jun. de 2012
Respostas 7
Participantes 3