Dúvida quanto ao ManagedBean e o Modelo

No meu managedbean, eu faço a comunicação entre os facelets e os modelos. Então vem a dúvida, de qual melhor caminho a seguir. Veja abaixo o ManagedBean.

[code]@ManagedBean(value=“MostraEsc”)
@SessionScoped

public class MostraEscolaAtiva {

Escola escola;

EscolaDaoImp edi = new EscolaDaoImp();

public void handleToggle(ToggleEvent event) { 
    FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Fieldset Toggled", "Visibility:" + event.getVisibility());   
    FacesContext.getCurrentInstance().addMessage(null, msg); 
}       

}[/code]

O que eu quero é criar um método que traga todas as escolas, dentro de uma condição do meu select. Esse select me trará o nome da escola e a sua direção, mas no meu XHTML eu coloco apenas o nome das escolas e em outra posição a direção da mesma. Então eu criei uma classe chamada EscolaImp. Conforme abaixo:

[code]public class EscolaDaoImp implements EscolaDAO{

@Override
public Class<Escola> getEntityType() {
    return Escola.class;
}

}[/code]

Ai eu pergunto. O método para trazer as escolas, deve estar implementado em EscolaImp, certo? O que eu coloco no meu ManagedBean? Só a chamada? Extender a classe EscolaImp e dar um new nela e chamar o método em questão ou não é bem assim?

Se vc puder usar Spring fica ainda melhor:

@ManagedBean(value="MostraEsc")  
@SessionScoped  
  
public class MostraEscolaAtiva {  
     
    Escola escola;  
     @Resource
    EscolaDao dao;

public void buscarEscolas(){
   escolas  = dao.buscarEscolas();
}

Se, você estiver usando Spring você implementa em EscolaImpl e no MB…

 @ManagedBean(value="MostraEsc")  
 @SessionScoped  
 @Controller  
 public class MostraEscolaAtiva {  
      
     Escola escola;  

     @Resource 
     EscolaDaoImp edi;  
      
     public void handleToggle(ToggleEvent event) {   
         FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Fieldset Toggled", "Visibility:" + event.getVisibility());     
         FacesContext.getCurrentInstance().addMessage(null, msg);   
     }         
 } 

e utilizar sua impl normalmente.

O fato é que eu não consigo ntrazer escola nenhuma no meu XHTML. Lá no outputtext value = "#{MostraEsc.NomeMétodoTrazEscola}">; não vem nada nele. Entã, a questã é que falta também a conexão com o banco dados e nesses exemplos que passei não tem ele. Em que momento ou em em que classe eu faço a conexão? Na EscolaDaoImp? Ou como fazer. Eu tenho muita dúvida nesses passos. Preciso dar esse resultado até amanhã, ou seja, fazer listar as escolas no meu XHTML e fechar esse ciclo. Aí bate o desespero. Fiquei ontem todo domingo para resolver isso. Li muito, mas agora preciso por em prática e falta a mim alguns conceitos. Talvez eu não esteja conseguindo passar a minha dúvida, acho que esse é o problema. Não uso SPRING não, acho que vai complicar mais a minha dúvida.

Este é o select que deve trazer as escolas do professor logado.

select distinct p.nome as "Professor",p.sobrenome as "SobreNome",e.nome as "Escola",m.situacao as "Situação" from pessoa p inner join professor f on (p.idpessoa = f.idpessoa) inner join matricula m on (m.idprofessor = f.idprofessor) inner join escola e on (e.idescola = m.idescola) where m.situacao = 'A'
Onde eu coloco ele para listar as escolas?

Cara aí depende…
Que tipo de conexão você vai fazer…JDBC, vai utilizar Hibernate, Hibernate + JPA…

Você tem que criar um método que vai retornar o seu Objeto “Escola” ou uma lista de Escola(List).
Esse método vai ficar na sua impl.

Uso Hibernate/JPA. O meu método é mais ou menos esse, mas está dando erro no Return, pois ele tá pedindo para fazer um cast no Add cast to ‘query’

public List<Escola> findAll() { Query query = (Query) em.createQuery("select distinct p.nome ,p.sobrenome , " + "e.nome as , m.situacao " + "from " + "pessoa p inner join professor f on (p.idpessoa = f.idpessoa) " + "inner join matricula m on (m.idprofessor = f.idprofessor) " + "inner join escola e on (e.idescola = m.idescola)" + "where m.situacao = 'A'"); return query.getResultList(); }

Pelo contrário,usando Spring iria facilitar tua vida um bocado.

Recomendo que mais pra frente vc dê uma olhada.

[quote=pjava]Uso Hibernate/JPA. O meu método é mais ou menos esse, mas está dando erro no Return, pois ele tá pedindo para fazer um cast no Add cast to ‘query’

public List<Escola> findAll() { Query query = (Query) em.createQuery("select distinct p.nome ,p.sobrenome , " + "e.nome as , m.situacao " + "from " + "pessoa p inner join professor f on (p.idpessoa = f.idpessoa) " + "inner join matricula m on (m.idprofessor = f.idprofessor) " + "inner join escola e on (e.idescola = m.idescola)" + "where m.situacao = 'A'"); return query.getResultList(); }[/quote]

tenta dar um (List<Escola> ) query.getResultList();

Como está o import da sua Query??

import javax.persistence.Query;

Outra coisa…

return  (List<Escola>) query.getResultList();

e uma dica…

no seu atributo em…
não pegue direto o atributo da classe.

Implemente esse método e utilize para criar a query

	protected EntityManager getEntityManager()
	{
		if (this.entityManager == null)
			throw new IllegalStateException("Erro");
		return this.entityManager;
	}


 public List<Escola> findAll() {  
           Query query =  getEntityManager().createQuery("select distinct p.nome ,p.sobrenome , " +  
                                                "e.nome as , m.situacao " +   
                                                "from " +  
                                                  "pessoa p inner join professor f on (p.idpessoa = f.idpessoa) " +  
                                                  "inner join matricula m on (m.idprofessor = f.idprofessor) " +  
                                                  "inner join escola e on (e.idescola = m.idescola)" +  
                                                  "where m.situacao = 'A'");  
           return (List<Escola>) query.getResultList();  
 }

Não funcionou. Continua com o erro. Ele pede o cast de qualquer forma. Será os imports?

faltou o set…rsrs

segue.

	@PersistenceContext
	public void setEntityManager(EntityManager em) {
		this.entityManager = em;
	}

Cara, fica dando erro no entityManager. Coloquei com o ‘E’ maiúsculo e continua dando o mesmo erro, que não é possível resolver entityManager. Aí ele pede para criar uma constante e se eu crio, dá pau no query. Tá uma zona e ainda não consegui listar nada na minha página.

Ficou assim meu managedBean

[code]@ManagedBean(value=“MostraEsc”)
@SessionScoped

public class MostraEscolaAtiva {

private static final int List = 0;
private static final int Escola = 0;
private DataModel listaEscola;
private EntityManager em; 

public void handleToggle(ToggleEvent event) {  
    FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Fieldset Toggled", "Visibility:" + event.getVisibility());    
    FacesContext.getCurrentInstance().addMessage(null, msg);  
}  	

public void setListaEscola(DataModel listaEscola) {
	this.listaEscola = listaEscola;
}

public DataModel getListaEscola(){
	List&lt;Escola&gt; lista = new EscolaDaoImp().list();
	listaEscola = new ListDataModel(lista);
	return listaEscola;
}
public EntityManager getEm() {
	return em;
}

public void setEm(EntityManager em) {
	this.em = em;
}

public static int getList() {
	return List;
}

protected EntityManager getEntityManager()
{
if (this.em == null)
throw new IllegalStateException(“Erro”);
return this.em;
}

@PersistenceContext
public void setEntityManager(EntityManager em) {
this.em = em;
}

public List&lt;Escola&gt; findAll() {    
          Query query =  getEntityManager().createQuery("select distinct e.nome " +     
                                                        "from " +    
                                                        "pessoa p inner join professor f on (p.idpessoa = f.idpessoa) " +    
                                                        "inner join matricula m on (m.idprofessor = f.idprofessor) " +    
                                                        "inner join escola e on (e.idescola = m.idescola)" +    
                                                        "where m.situacao = 'A'");    
          return (List&lt;Escola&gt;) query.getResultList();    
}  

}[/code]
É isso mesmo? Eu troquei o entityManager para[color=red] em[/color], pois esse é o atributo. Eu ainda não entendi o que tenho que fazer agora startar o PostgreSql e listar. Para listar é somente isso:
value = #{MostraEsc.findAll}; É só isso que eu coloco nop meu XHTML? Pq isso eu fiz e nada aconteceu, acho que tem problema ainda no banco para startar ele pelo java e etc…

a opção de fazê-lo, como por exemplo o web.xml, hibernate.cfg.xml e etc… Não me aparece a opção Persistence.xml. Se for do zero como faço e onde coloco, se no WebContent, src e etc…?

Como assim erro para startar o PostGree??
Você está usando JPA, certo?
Onde está seu arquivo de Persistence.xml?

Se ele estiver configurado corretamente, quando você chamar sua impl ele já faz a conexão com o banco.

no xhtml , vc deve chamar seu #{managedBean.metodoQueRetornaSuaLista}

Onde se coloca o Persistence.xml? Na pasta WebContente ou na pasta src ou Web-Inf?

No meu projeto eu coloquei dentro de META-INF

Criei esse arquivo Persistence.xml e tá dando erro. Dá erro na primeira linha, do tipo:
The processing instruction target matching"[xX][mM][lL]" is not allowed

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"&gt; &lt;persistence-unit name="maindatabasePU" transaction-type="RESOURCE_LOCAL"&gt; &lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt; &lt;properties&gt; &lt;property name="hibernate.connection.driver_class" value="org.postgresql.Driver" /&gt; &lt;property name="hibernate.connection.username" value="postgres" /&gt; &lt;property name="hibernate.connection.password" value="123" /&gt; &lt;property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5435/Escola" /&gt; &lt;property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /&gt; &lt;property name="hibernate.show_sql" value="true" /&gt; &lt;/properties&gt; &lt;/persistence-unit&gt; &lt;/persistence&gt;