Ajuda!

9 respostas
rafa120

Pessoal, estou travado aqui…preciso de uma ajuda…faco faco…e nao chego em lugar nenhum

Eu tenho 2 tabelas com chave estrangeira e quero fazer uma consulta e mostrar na pagina. Está certo oq eu fiz? As classes e as definicoes ManyToOne/OneToMany … etc? Acho q essa parte de relacionamento q ta com algum problema
Preciso descobrir se da forma q fiz, está correto…e ai partir pra ver se roda
obs: antes eu usava sem chave estrangeira e funcionava perfeito…agora q mudei a estrutura complicou um pouco

Classe Changes

@Entity
@Table(name="changes")
public class Changes  implements java.io.Serializable {
    
     @Id
     @GeneratedValue(strategy=GenerationType.AUTO)
     @Column(name="id",nullable=false)
     private Integer id;
     
     @Column(name="change_number",nullable=false, length=30)
     private String changeNumber;

     //Tirei os outros campos para nao ficar mto grande o topico	
	
     @Column(name="critical", length=3)
     private String critical;
     
     @ManyToOne
     @JoinColumn(name="id_user", referencedColumnName="id_user")
     
     private Usuario usuario;

	//Getters e Setters
Classe Usuario

`

@Entity

@Table(name=usuario)

public class Usuario implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id_user",nullable=false)
private Integer id_user;

@Column(name="authority",nullable=false, length=20)
private String authority;

//Tirei os outros campos para nao ficar mto grande o topico

@Column(name="bucket",nullable=false, length=10)
private String bucket;

@OneToMany(mappedBy="usuario")
private List<Changes> listaChanges;
ChangesDaoImpl
<a class="mention" href="/u/override">@Override</a>

public List buscarPorFLM() {

Session session = HibernateUtil.getSessionFactory().openSession();

return session.createQuery(“SELECT c, u FROM Changes c, Usuario u WHERE u.flm = ‘Luis Henrique’ AND c.id_user = u.id_user”).list();

}
ChangesBean
public List getChangesFLM() {

ChangesDao changesDao = new ChangesDaoImpl();

changes = changesDao.buscarPorFLM();

return changes;

}
listachanges.xhtml
<h:form id="frmChanges">
                 <p:dataTable id="datatable" var="change" value="#{changesBean.changesFLM}" emptyMessage="No changes found."
                              paginator="true" rows="15" paginatorPosition="bottom" rowKey="#{change.id}" selectionMode="single"
                              paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
                              rowsPerPageTemplate="5,10,15,25,35">
                     <f:facet name="header">  
                         Search changes  
                     </f:facet>
                         
                     <p:column headerText="Customer" filterBy="#{change.customer}" sortBy="#{change.customer}">
                         <h:outputText value="#{change.customer}" />
                     </p:column>
                     
                      <p:column headerText="System" filterBy="#{change.system}" sortBy="#{change.system}">
                         <h:outputText value="#{change.system}" />
                     </p:column>
                     
	<h:form>

9 Respostas

Krismorte

Faltou a parte do codigo que faz a consulta.

rafa120

Faltou nao…é este aqui…ChangesDaoImpl

@Override public List<Changes> buscarPorFLM() { Session session = HibernateUtil.getSessionFactory().openSession(); return session.createQuery("SELECT c, u FROM Changes c, Usuario u WHERE u.flm = 'Luis Henrique' AND c.id_user = u.id_user").list();

Krismorte

Certo, você esta fazendo a consulta apenas pelo Changes e quer exibir também as informações de Customer, né.

Altera esse relacionamento aqui

@OneToMany(mappedBy=“usuario”),fetch=FetchType.EAGER)

rafa120

Eu consegui fazer o select…deu certo…

Mas quando vou cadastrar algo na tabela Changes e coloco a id_user q vem da tabela Usuario, me gera este erro que estou analisando ainda

Advertência: /pages/changes.xhtml @281,140 value="#{changesBean.change.usuario.idUser}": Target Unreachable, 'null' returned null javax.el.PropertyNotFoundException: /pages/changes.xhtml @281,140 value="#{changesBean.change.usuario.idUser}": Target Unreachable, 'null' returned null

meu html
<p:inputText value="#{changesBean.change.usuario.idUser}" required="true" style="width: 200px" maxlength="40"/>

Changes (somente a parte onde aponto a id_user da outra tabela)
@OneToOne @JoinColumn(name="id_user", referencedColumnName="id_user") private Usuario usuario;

Krismorte

Certo, agora tu tens que adicionar outra opção

@OneToMany(mappedBy="usuario",fetch=FetchType.EAGER,cascade = CascadeType.ALL)

Depois da uma lida no que cada opção dessa faz

rafa120

Ola…ja estava assim…tanto é que está funcionando o select com o dado vindo de outra…
o problema é que agora nao estou conseguindo adicionar o dado q vem da chave estrangeira

@OneToMany(mappedBy="usuario") private List<Changes> listaChanges;

Krismorte

Copia os parametros que coloquei na resposta acima

rafa120

Alterei, fiz os imports…tudo beleza…mas persiste o erro

@OneToMany(mappedBy="usuario",fetch=FetchType.EAGER,cascade = CascadeType.ALL) private List<Changes> listaChanges;

Erro:
Advertência: /pages/changes.xhtml @281,140 value="#{changesBean.change.usuario.idUser}": Target Unreachable, 'null' returned null javax.el.PropertyNotFoundException: /pages/changes.xhtml @281,140 value="#{changesBean.change.usuario.idUser}": Target Unreachable, 'null' returned null

Krismorte

Sim, sim, foi mal. Você não vai associar o id diretamente ao outro objeto. Você vai passar o objeto inteiro, mas pra isso funcionar você vai ter que criar uma classe converter.

Exemplo:

package converter;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

import model.GrauDificuldade;
import business.GrauDificuldadeBusiness;

@FacesConverter(forClass=GrauDificuldade.class,value="grauDificuldadeConverter")
public class GrauDificuldadeConverter implements Converter {

	private GrauDificuldadeBusiness business = new GrauDificuldadeBusiness();

    @Override
    public Object getAsObject(FacesContext fc, UIComponent uic, String string) {
        try {
            return business.selecionar(Long.parseLong(string));
        } catch (NumberFormatException ex) {
            //JSFMessageUtil.addMsgLog(JSFMessageUtil.matricula, CityConverter.class.getCanonicalName(), "Erro: " + ex.getMessage());
            ex.printStackTrace();
            return null;
        }
    }

    @Override
    public String getAsString(FacesContext fc, UIComponent uic, Object o) {
    	GrauDificuldade object = (GrauDificuldade) o;

        try {
            return String.valueOf(object.getId());
        } catch (Exception e) {
            //JSFMessageUtil.addMsgLog(JSFMessageUtil.matricula, CityConverter.class.getCanonicalName(), "Erro: " + e.getMessage());
            e.printStackTrace();
            return null;
        }
    }	
}

na sua pagina JSF adiciona essa tag

<h:selectOneMenu id="pontos" value="#{palavrasBean.palavra.grauDificuldade}">
                                <f:selectItems value="#{palavrasBean.listaGrau}" var="grau" itemLabel="#{grau.nome}" itemValue="#{grau}"></f:selectItems>
                                <f:converter converterId="grauDificuldadeConverter" />
                            </h:selectOneMenu>

ve ai como fica

Criado 16 de fevereiro de 2016
Ultima resposta 17 de fev. de 2016
Respostas 9
Participantes 2