Bom dia pessoal. Tou uma dificuldade.
Eu criei uma Enterprise Application no NetBeans com JSF 2.0. Gerei o CRUD automaticamente, para as tabelas Pais e Cidade. Sendo assim, para cada entidade, ele cria EntityBeans, SessionBeans, Controller, páginas Create.xhtml Edit.xhtml, List.xhtml e View.xhtml.
No List.xhtml para a entidade Cidade, ele visualiza o idCidade, nomeCidade e idPais. Mas o que eu quero mesmo é que ele ao invés de visualizar o idPais, visualize nomePais.
No EntityBean da Cidade, foi gerado apenas o campo idCidade, nomeCidade e pais(este é um id_pais). Eis o codigo:
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id_cidade")
private Integer idCidade;
@Basic(optional = false)
@Column(name = "nome_cidade")
private String nomeCidade;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "cidade")
@JoinColumn(name = "id_pais", referencedColumnName = "id_pais")
@ManyToOne(optional = false)
private Pais pais;
Será que é preciso neste bean acrescentar alguma anotação?
Isso não tem muito haver com o hibernate e sim com o hibernate.
Verifica em seus xhtml o que está mostrando.
Se você está jogado o objeto sobrescreve o método toString
Olá amigo,
Na realidade o Objeto cidade vc ja tem carregado…
veja no arquivo list.xhtml e procure pela tag que está exibindo o id e cole ela aqui pra gente ver…
mas é no JSF list.xhtml que vc vai mexer sim…
tipo sefor um data table do richfaces…
cole o codigo do datatabel pra gente ver…
Não lembro a sintaxe de cabeça mas posso ajudar…
Fallow
O código do controller para Cidade, em suma, é o seguinte:
.
.
.
@ManagedBean (name="cidadeController")
@SessionScoped
public class CidadeController {
private Cidade current;
private DataModel items = null;
@EJB private sessao.CidadeFacade ejbFacade;
private PaginationHelper pagination;
private int selectedItemIndex;
public CidadeController() {
}
public Cidade getSelected() {
if (current == null) {
current = new Cidade();
selectedItemIndex = -1;
}
return current;
}
private CidadeFacade getFacade() {
return ejbFacade;
}
public DataModel getItems() {
if (items == null) {
items = getPagination().createPageDataModel();
}
return items;
}
.
.
.
}
Agora, para a página de listagem da entidade cidade, List.xhtml, o código mais relevante, que está dentro de um datatable, é o seguinte:
<h:dataTable value="#{cidadeController.items}" var="item" border="0" cellpadding="2" cellspacing="0" rowClasses="jsfcrud_odd_row,jsfcrud_even_row" rules="all" style="border:solid 1px">
<h:column>
<f:facet name="header">
<h:outputText value="#{bundle.ListCidadeTitle_pais}"/>
</f:facet>
<h:outputText value="#{item.pais}"/>
</h:column>
</h:dataTable>
Oi Don Quixote,
Pelo que vi aqui seu dataTable está chamando o método toString() do seu Objeto dentro do DataModel retornado pelo controler.
Tente alterar o trecho
<h:outputText value="#{item.pais}"/>
para
<h:outputText value="#{item.nomeCidade}"/>
Veja se funciona, pois o trecho #{item.pais} é o nome do atributo pais dentro de cidade , e o certo para o nome da cidade seria #{item.nomeCidade}…
Teste ai e veja se funciona
Fallow
Não é nomeCidade que eu quero apresentar, mas sim nomePais. A minha dúvida consiste em como buscar o nomePais… se será usando anotações no entity bean Cidade, ou de alguma outra forma.
Certo então tente essa linha:
<h:outputText value="#{item['pais'].nomePais}"/>
Fallow
Funcionou mano. Mas você pode me indicar aonde é que eu posso encontrar material sobre isso? Procurei um pouco pela net e não encontrei. Quem sabe n procurei direito.
Obrigado.
Isso é bem simples…
Pesquise sobre jstl e expression language do jsf…
no data table a sintaxe é igual a um foreach
for (Cliente c:getListaClientes()){
system.out.println(c.getNome());
// se cliente contiver referencia a lista de Compras efetuadas
system.out.println(c.getCompasEfetuadas().size());
}
veja o seu dataTable:
[code]
// var=item significa o nome da variavel, equivale ao c do for anterior, e value="#{cidadeController.items}" equivale ao getListaClientes do for anterior
<h:dataTable value="#{cidadeController.items}" var=“item” border=“0” cellpadding=“2” cellspacing=“0” rowClasses=“jsfcrud_odd_row,jsfcrud_even_row” rules=“all” style=“border:solid 1px”>
<h:column>
<f:facet name=“header”>
<h:outputText value="#{bundle.ListCidadeTitle_pais}"/>
</f:facet>
<h:outputText value="#{item.[‘pais’].nomePais}"/>
</h:column>
//crio uma nova coluna no dataTable
<h:column>
<f:facet name=“header”>
<h:outputText value="#{bundle.ListCidadeTitle_pais}"/>
</f:facet>
// o . serve para dizer que vc quer algo contido no objeto se vc usasse #{item.pais[‘nomePais’]} acho que também funcionaria…
<h:outputText value="#{item.[‘pais’].nomePais}"/>
</h:column>
</h:dataTable>
Mas esse conseito vem das ELs e das JSTLs do JavaEE
Espero ter ajudado
Fallow
Fallow
Isso é bem simples…
Pesquise sobre jstl e expression language do jsf…
no data table a sintaxe é igual a um foreach
for (Cliente c:getListaClientes()){
system.out.println(c.getNome());
// se cliente contiver referencia a lista de Compras efetuadas
system.out.println(c.getCompasEfetuadas().size());
}
veja o seu dataTable:
[code]
// var=item significa o nome da variavel, equivale ao c do for anterior, e value="#{cidadeController.items}" equivale ao getListaClientes do for anterior
<h:dataTable value="#{cidadeController.items}" var=“item” border=“0” cellpadding=“2” cellspacing=“0” rowClasses=“jsfcrud_odd_row,jsfcrud_even_row” rules=“all” style=“border:solid 1px”>
<h:column>
<f:facet name=“header”>
<h:outputText value="#{bundle.ListCidadeTitle_pais}"/>
</f:facet>
<h:outputText value="#{item.[‘pais’].nomePais}"/>
</h:column>
//crio uma nova coluna no dataTable
<h:column>
<f:facet name=“header”>
<h:outputText value="#{bundle.ListCidadeTitle_pais}"/>
</f:facet>
// o . serve para dizer que vc quer algo contido no objeto se vc usasse #{item.pais[‘nomePais’]} acho que também funcionaria…
<h:outputText value="#{item.[‘pais’].nomePais}"/>
</h:column>
</h:dataTable>
[code]
Mas esse conseito vem das ELs e das JSTLs do JavaEE
Espero ter ajudado
Fallow
Isso é bem simples…
Pesquise sobre jstl e expression language do jsf…
no data table a sintaxe é igual a um foreach
for (Cliente c:getListaClientes()){
system.out.println(c.getNome());
// se cliente contiver referencia a lista de Compras efetuadas
system.out.println(c.getCompasEfetuadas().size());
}
veja o seu dataTable:
// var=item significa o nome da variavel, equivale ao c do for anterior, e value="#{cidadeController.items}" equivale ao getListaClientes do for anterior
<h:dataTable value="#{cidadeController.items}" var="item" border="0" cellpadding="2" cellspacing="0" rowClasses="jsfcrud_odd_row,jsfcrud_even_row" rules="all" style="border:solid 1px">
<h:column>
<f:facet name="header">
<h:outputText value="#{bundle.ListCidadeTitle_pais}"/>
</f:facet>
<h:outputText value="#{item.['pais'].nomePais}"/>
</h:column>
//crio uma nova coluna no dataTable
<h:column>
<f:facet name="header">
<h:outputText value="#{bundle.ListCidadeTitle_pais}"/>
</f:facet>
// o . serve para dizer que vc quer algo contido no objeto se vc usasse #{item.pais['nomePais']} acho que também funcionaria..
<h:outputText value="#{item.['pais'].nomePais}"/>
</h:column>
</h:dataTable>
Mas esse conseito vem das ELs e das JSTLs do JavaEE
Espero ter ajudado
Fallow
Muito obrigado. Deu para perceber.
De facto, a 2ª forma como você escreveu tbm funciona, até é mais fácil de alterar, pois o código inicial era #{item.pais} e apenas mudou para #{item.pais[‘nomePais’]}.
Um abraço.