listar as entidades envolvidas no relacionamento muitos pata muitos
Tenho um relaciomanto muitos-para-muitos onde eu tenho duas tabelas Polo e Empresa e faço um join table onde eu criei uma tabela com a chave da duas tabelas envolvidas.Criei a classe PoloEmpresa e PoloEmpresaPK, eu queri fazer um list ou um sql que retorne oa campos para eu jogar em mum <p:dataTable>. O comando sql est legal ele me retorna mas eu não consigo apontar o resulta para as classes para pode listar no datatable.
Veja o sql
StringBuffer sql = new StringBuffer();
sql.append(select p.*,e.* from polo p join polo_empresa pe );
sql.append( on(p.id_polo = pe.id_polo) join );
sql.append( empresa e on(e.id_empresa = pe.id_empresa));
SQLQuery query = this.session.createSQLQuery(sql.toString());
query.addEntity(e,Empresa.class);
query.addEntity(p,Polo.class);
return query.list();
______________________________________
classe PK
@Embeddable
public class PoloEmpresaPK implements Serializable{
private static final long serialVersionUID = 2145230426707580106L;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name=id_polo)
private Polo polo;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = id_empresa)
private Empresa empresa;
public Polo getPolo() {
return polo;
}
public void setPolo(Polo polo) {
this.polo = polo;
}
public Empresa getEmpresa() {
return empresa;
}
public void setEmpresa(Empresa empresa) {
this.empresa = empresa;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((empresa == null) ? 0 : empresa.hashCode());
result = prime * result + ((polo == null) ? 0 : polo.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
PoloEmpresaPK other = (PoloEmpresaPK) obj;
if (empresa == null) {
if (other.empresa != null)
return false;
} else if (!empresa.equals(other.empresa))
return false;
if (polo == null) {
if (other.polo != null)
return false;
} else if (!polo.equals(other.polo))
return false;
return true;
}
_______________________________
Classe polo empresa
@Entity
@Table(name=polo_empresa)
public class PoloEmpresa implements Serializable {
/**
*
*/
private static final long serialVersionUID = 6176645767173588871L;
@EmbeddedId
private PoloEmpresaPK chaveComposta;
public PoloEmpresaPK getChaveComposta() {
return chaveComposta;
}
public void setChaveComposta(PoloEmpresaPK chaveComposta) {
this.chaveComposta = chaveComposta;
}
________________
classe polo
@Entity
@Table(name=polo)
@SequenceGenerator(name=seq_polo,sequenceName=seq_polo)
public class Polo implements Serializable{
private static final long serialVersionUID = -6638112313261035555L;
@Id
@GeneratedValue(generator=seq_polo,strategy=GenerationType.AUTO)
@Column(name=id_polo)
private Integer codigoPolo;
@Column(name=nome,length=40)
private String nome ;
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name=polo_empresa,joinColumns={@JoinColumn(name=id_polo)},
inverseJoinColumns={@JoinColumn(name=id_empresa)})
@Cascade(CascadeType.SAVE_UPDATE)
@org.hibernate.annotations.ForeignKey(name = fk_polo_empresa)
//private Set<Empresa> empresa = new HashSet<Empresa>();
private Collection<Empresa> empresaList;
__________________________
classe empresa
@Entity
@Table(name=empresa)
@SequenceGenerator(name=seq_empresa,sequenceName=seq_empresa)
public class Empresa implements Serializable{
private static final long serialVersionUID = 498803724556690440L;
@Id
@GeneratedValue(generator=seq_empresa,strategy= GenerationType.AUTO)
@Column(name=id_empresa)
private Integer codigoEmpresa;
@Column(name=nome,length=40)
private String nome ;
@Column(name=nome_fan,length=20)
private String nomeFantasia ;
Veja o sql
StringBuffer sql = new StringBuffer();
sql.append(select p.*,e.* from polo p join polo_empresa pe );
sql.append( on(p.id_polo = pe.id_polo) join );
sql.append( empresa e on(e.id_empresa = pe.id_empresa));
SQLQuery query = this.session.createSQLQuery(sql.toString());
query.addEntity(e,Empresa.class);
query.addEntity(p,Polo.class);
return query.list();
______________________________________
classe PK
@Embeddable
public class PoloEmpresaPK implements Serializable{
private static final long serialVersionUID = 2145230426707580106L;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name=id_polo)
private Polo polo;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = id_empresa)
private Empresa empresa;
public Polo getPolo() {
return polo;
}
public void setPolo(Polo polo) {
this.polo = polo;
}
public Empresa getEmpresa() {
return empresa;
}
public void setEmpresa(Empresa empresa) {
this.empresa = empresa;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((empresa == null) ? 0 : empresa.hashCode());
result = prime * result + ((polo == null) ? 0 : polo.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
PoloEmpresaPK other = (PoloEmpresaPK) obj;
if (empresa == null) {
if (other.empresa != null)
return false;
} else if (!empresa.equals(other.empresa))
return false;
if (polo == null) {
if (other.polo != null)
return false;
} else if (!polo.equals(other.polo))
return false;
return true;
}
_______________________________
Classe polo empresa
@Entity
@Table(name=polo_empresa)
public class PoloEmpresa implements Serializable {
/**
*
*/
private static final long serialVersionUID = 6176645767173588871L;
@EmbeddedId
private PoloEmpresaPK chaveComposta;
public PoloEmpresaPK getChaveComposta() {
return chaveComposta;
}
public void setChaveComposta(PoloEmpresaPK chaveComposta) {
this.chaveComposta = chaveComposta;
}
________________
classe polo
@Entity
@Table(name=polo)
@SequenceGenerator(name=seq_polo,sequenceName=seq_polo)
public class Polo implements Serializable{
private static final long serialVersionUID = -6638112313261035555L;
@Id
@GeneratedValue(generator=seq_polo,strategy=GenerationType.AUTO)
@Column(name=id_polo)
private Integer codigoPolo;
@Column(name=nome,length=40)
private String nome ;
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name=polo_empresa,joinColumns={@JoinColumn(name=id_polo)},
inverseJoinColumns={@JoinColumn(name=id_empresa)})
@Cascade(CascadeType.SAVE_UPDATE)
@org.hibernate.annotations.ForeignKey(name = fk_polo_empresa)
//private Set<Empresa> empresa = new HashSet<Empresa>();
private Collection<Empresa> empresaList;
__________________________
classe empresa
@Entity
@Table(name=empresa)
@SequenceGenerator(name=seq_empresa,sequenceName=seq_empresa)
public class Empresa implements Serializable{
private static final long serialVersionUID = 498803724556690440L;
@Id
@GeneratedValue(generator=seq_empresa,strategy= GenerationType.AUTO)
@Column(name=id_empresa)
private Integer codigoEmpresa;
@Column(name=nome,length=40)
private String nome ;
@Column(name=nome_fan,length=20)
private String nomeFantasia ;
Jose Boas
Curtidas 0
Respostas
Davi Costa
29/03/2012
Se vc está mapeando o relacionamento assim:
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name=polo_empresa,joinColumns={@JoinColumn(name=id_polo)},
inverseJoinColumns={@JoinColumn(name=id_empresa)})
@Cascade(CascadeType.SAVE_UPDATE)
@org.hibernate.annotations.ForeignKey(name = fk_polo_empresa)
//private Set<Empresa> empresa = new HashSet<Empresa>();
private Collection<Empresa> empresaList;
nem é para tem a entidade PoloEmpresa, sério mesmo não precisa nem dela nem de PoloEmpresaPK, pode deletar sem medo de ser feliz.
Basta vc fazer um select normal em polo que sempre vai trazer as empresas juntos, pode acreditar.
Porém como está lazy o relacionamento vai dar lazyException quando vc der um getEmpresaList(), caso não tenha nenhuma transação aberta. A solução é remove o lazy na sua aplicação seja muito requerido a lista de empresas do polo, para ele num select só sempre trazer as empresas do polo (na minha opnião melhor opção), ou sempre que for dar esse getEmpresaList() em polo fazer uma consulta no banco paar trazer as empresas pertences a esse polo.
Mais uma dica que tal deixar assim o mapeamento:
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name=polo_empresa,joinColumns={@JoinColumn(name=id_polo)},
inverseJoinColumns={@JoinColumn(name=id_empresa)})
//@Cascade(CascadeType.SAVE_UPDATE)
@Fetch(FetchMode.SUBSELECT)
//@org.hibernate.annotations.ForeignKey(name = fk_polo_empresa)
//private Set<Empresa> empresa = new HashSet<Empresa>();
private Collection<Empresa> empresaList;
Observou o trecho comentado e a adição de subselect... esse cascade também é desnecessário se vc seguir minhas dicas, ele já vai atualizar por cascata direitinho sempre que fizer isso. Mas sóvai funcionar se vc seguir todos os passos mesmo removendo PoloEmpresa e PoloEmpresaPK, o JPA já vai fazer isso tudo para vc inclusive se vc gerar o banco via aplicação vai perceber que mesmo sem ter essas classes no java (PoloEmpresa e PoloEmpresaPK) o banco vai estar com essa tabela criada lá ele entende esse mapeamento e faz a mágica @JoinTable(name=polo_empresa,joinColumns={@JoinColumn(name=id_polo)},
inverseJoinColumns={@JoinColumn(name=id_empresa)}).
espero ter ajudado
att Davi
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name=polo_empresa,joinColumns={@JoinColumn(name=id_polo)},
inverseJoinColumns={@JoinColumn(name=id_empresa)})
@Cascade(CascadeType.SAVE_UPDATE)
@org.hibernate.annotations.ForeignKey(name = fk_polo_empresa)
//private Set<Empresa> empresa = new HashSet<Empresa>();
private Collection<Empresa> empresaList;
nem é para tem a entidade PoloEmpresa, sério mesmo não precisa nem dela nem de PoloEmpresaPK, pode deletar sem medo de ser feliz.
Basta vc fazer um select normal em polo que sempre vai trazer as empresas juntos, pode acreditar.
Porém como está lazy o relacionamento vai dar lazyException quando vc der um getEmpresaList(), caso não tenha nenhuma transação aberta. A solução é remove o lazy na sua aplicação seja muito requerido a lista de empresas do polo, para ele num select só sempre trazer as empresas do polo (na minha opnião melhor opção), ou sempre que for dar esse getEmpresaList() em polo fazer uma consulta no banco paar trazer as empresas pertences a esse polo.
Mais uma dica que tal deixar assim o mapeamento:
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name=polo_empresa,joinColumns={@JoinColumn(name=id_polo)},
inverseJoinColumns={@JoinColumn(name=id_empresa)})
//@Cascade(CascadeType.SAVE_UPDATE)
@Fetch(FetchMode.SUBSELECT)
//@org.hibernate.annotations.ForeignKey(name = fk_polo_empresa)
//private Set<Empresa> empresa = new HashSet<Empresa>();
private Collection<Empresa> empresaList;
Observou o trecho comentado e a adição de subselect... esse cascade também é desnecessário se vc seguir minhas dicas, ele já vai atualizar por cascata direitinho sempre que fizer isso. Mas sóvai funcionar se vc seguir todos os passos mesmo removendo PoloEmpresa e PoloEmpresaPK, o JPA já vai fazer isso tudo para vc inclusive se vc gerar o banco via aplicação vai perceber que mesmo sem ter essas classes no java (PoloEmpresa e PoloEmpresaPK) o banco vai estar com essa tabela criada lá ele entende esse mapeamento e faz a mágica @JoinTable(name=polo_empresa,joinColumns={@JoinColumn(name=id_polo)},
inverseJoinColumns={@JoinColumn(name=id_empresa)}).
espero ter ajudado
att Davi
GOSTEI 0
Jose Boas
29/03/2012
Blz eu entendi, inclusive fiz um teste, mas como eu pego o nome da empresa e jogo no <p:dataTable> pois ao fazer
assim polo.empresaList.nomeFantasia da erro no nomeFantasia que não identificou, se não fosse uma collection
daria certo.
<p:column style=width:40px sortBy=#{polo.empresaList}>
<f:facet name=header>Nome Polo</f:facet>
<h:outputText value=#{polo.empresaList.nomeFantasia}/>
</p:column>
assim polo.empresaList.nomeFantasia da erro no nomeFantasia que não identificou, se não fosse uma collection
daria certo.
<p:column style=width:40px sortBy=#{polo.empresaList}>
<f:facet name=header>Nome Polo</f:facet>
<h:outputText value=#{polo.empresaList.nomeFantasia}/>
</p:column>
GOSTEI 0
Davi Costa
29/03/2012
o valer da table vai ser polo.empresaList
ai na tabela vc cria um var=emp... esse var é um objeto empresa,
basta na colunas colocar emp.nomeDaEmpresa
Como se fosseuma lista normal cara... o jsf vai reconhecer polo.empresaList como qual outra lista.
Vc não deve chamar no colum e sim definitna tabela
att Davi
ai na tabela vc cria um var=emp... esse var é um objeto empresa,
basta na colunas colocar emp.nomeDaEmpresa
Como se fosseuma lista normal cara... o jsf vai reconhecer polo.empresaList como qual outra lista.
Vc não deve chamar no colum e sim definitna tabela
att Davi
GOSTEI 0
Jose Boas
29/03/2012
Blz, ma como eu vou listar pois no value já tem o método que chama a lista eu queria que ficasse assim
Ex
Polo 1 Empresa 1
Polo 1 Empresa 2
Polo 3 Empresa 1
Veja como esta o meu <p:dataTable>
<p:dataTable
style=width:375px
paginator=true
rows=5
paginatorTemplate=
scrollable=false
value=#{poloBean.listaPoloEmpresa}
var=polo>
<f:facet name=header>
Lista de Empresas Associadas aos Polos
</f:facet>
<p:column style=width:10px sortBy=#{polo.codigoPolo}>
<f:facet name=header>Código</f:facet>
<h:outputText value=#{polo.codigoPolo}/>
</p:column>
<p:column style=width:40px sortBy=#{polo.nome}>
<f:facet name=header>Nome Polo</f:facet>
<h:outputText value=#{polo.nome}/>
</p:column>
<p:column style=width:40px sortBy=#{polo.empresaList}>
<f:facet name=header>Empresa</f:facet>
<h:outputText value=#{polo.empresaList}/>
</p:column>
<p:column style=width:4px>
<f:facet name=header>Exportar</f:facet>
<p:commandLink action=#{poloBean.desvinculaEmpresa} title=Exportar Polo update=:listaempresavinc>
<h:graphicImage library=imagens name=exportar16.png/>
<f:setPropertyActionListener value=# target=#{poloBean.empresaSelecionada}/>
</p:commandLink>
</p:column>
<f:facet name=footer>
Total de registros : #{fn:length(poloBean.listaPoloEmpresa)}
</f:facet>
</p:dataTable>
Ex
Polo 1 Empresa 1
Polo 1 Empresa 2
Polo 3 Empresa 1
Veja como esta o meu <p:dataTable>
<p:dataTable
style=width:375px
paginator=true
rows=5
paginatorTemplate=
scrollable=false
value=#{poloBean.listaPoloEmpresa}
var=polo>
<f:facet name=header>
Lista de Empresas Associadas aos Polos
</f:facet>
<p:column style=width:10px sortBy=#{polo.codigoPolo}>
<f:facet name=header>Código</f:facet>
<h:outputText value=#{polo.codigoPolo}/>
</p:column>
<p:column style=width:40px sortBy=#{polo.nome}>
<f:facet name=header>Nome Polo</f:facet>
<h:outputText value=#{polo.nome}/>
</p:column>
<p:column style=width:40px sortBy=#{polo.empresaList}>
<f:facet name=header>Empresa</f:facet>
<h:outputText value=#{polo.empresaList}/>
</p:column>
<p:column style=width:4px>
<f:facet name=header>Exportar</f:facet>
<p:commandLink action=#{poloBean.desvinculaEmpresa} title=Exportar Polo update=:listaempresavinc>
<h:graphicImage library=imagens name=exportar16.png/>
<f:setPropertyActionListener value=# target=#{poloBean.empresaSelecionada}/>
</p:commandLink>
</p:column>
<f:facet name=footer>
Total de registros : #{fn:length(poloBean.listaPoloEmpresa)}
</f:facet>
</p:dataTable>
GOSTEI 0
Davi Costa
29/03/2012
Nesse caso é o seguinte, vc precisa ir além da tabela, normal, vc precisa de uma tabela mestre detalhe.
Um componente parecido como esses:
http://www.primefaces.org/showcase/ui/datatableExpandableRows.jsf
http://livedemo.exadel.com/richfaces-demo/richfaces/dataTable.jsf
Para a cada pólo agrupar suas empresas.
att Davi
Um componente parecido como esses:
http://www.primefaces.org/showcase/ui/datatableExpandableRows.jsf
http://livedemo.exadel.com/richfaces-demo/richfaces/dataTable.jsf
Para a cada pólo agrupar suas empresas.
att Davi
GOSTEI 0
Jose Boas
29/03/2012
Blz, mas na verdade é que eu achei esta solucao para poder driblar uma outra, eu não consigo fazer a conversao do polo, a
idéia inicial era pegar polo em um combo e listar as empresas relacionadas em outro, eu ainda não fiz de listar o combo das empresas mas eu fiz um teste gravando apenas o polo para ver se dá certo mas ele retorna este erro.
Obs: eu consigo popular mas não consigo gravar
Erro de validação: o valor não é válido . Eu já fiz isso mas quando as tabelas são normais, no caso o polo é a tabela
que tem aquele esquema de ManyToMAny, e por coincidencia é nela que da problema, pois nos outros casos o meu conversor da certo.
Dá uma olhada em um conversor que funciona e a implementação no jsf e
Conversor
@FacesConverter(forClass=Categoria.class)
public class CategoriaConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if(value != null && value.trim().length() > 0 ){
Integer codigo = Integer.valueOf(value);
try{
CategoriaRN categoriaRN = new CategoriaRN();
return categoriaRN.carregar(codigo);
}catch(Exception e){
throw new ConverterException(Não foi possível encontrar a categoria de código + value + .+e.getMessage());
}
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value != null){
Categoria categoria = (Categoria) value;
return categoria.getCodigo().toString();
}
return ;
}
}
JSF
<h:selectOneMenu id=categoria value=#{lancamentoBean.editado.categoria}>
<f:selectItems value=#{categoriaBean.categoriasSelect} />
</h:selectOneMenu>
Eu fiz seguinte o mesmo esquema veja o que da erro
Conversor
@FacesConverter(forClass=Polo.class)
public class PoloConverter implements Converter{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
System.out.println(entrei no converter 1 = + value );
Polo polo = new Polo();
if(value != null && value.trim().length() > 0 ){
Integer codigo = Integer.valueOf(value);
try{
PoloRN poloRN = new PoloRN();
polo = poloRN.carregar(codigo);
return polo;
}catch(Exception e){
throw new ConverterException(Não foi possível encontrar o polo de código + value + .+e.getMessage());
}
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
System.out.println(entrei no converter 2 = + value );
if (value != null){
Polo polo = (Polo) value;
return polo.getCodigoPolo().toString();
}
return ;
}
}
JSF
<p:selectOneMenu id=polo value=#{planilhaBean.acidenteSelecionado.polo} style=width:180px>
<f:selectItems value=#{poloBean.poloSelect}/>
</p:selectOneMenu>
idéia inicial era pegar polo em um combo e listar as empresas relacionadas em outro, eu ainda não fiz de listar o combo das empresas mas eu fiz um teste gravando apenas o polo para ver se dá certo mas ele retorna este erro.
Obs: eu consigo popular mas não consigo gravar
Erro de validação: o valor não é válido . Eu já fiz isso mas quando as tabelas são normais, no caso o polo é a tabela
que tem aquele esquema de ManyToMAny, e por coincidencia é nela que da problema, pois nos outros casos o meu conversor da certo.
Dá uma olhada em um conversor que funciona e a implementação no jsf e
Conversor
@FacesConverter(forClass=Categoria.class)
public class CategoriaConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if(value != null && value.trim().length() > 0 ){
Integer codigo = Integer.valueOf(value);
try{
CategoriaRN categoriaRN = new CategoriaRN();
return categoriaRN.carregar(codigo);
}catch(Exception e){
throw new ConverterException(Não foi possível encontrar a categoria de código + value + .+e.getMessage());
}
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value != null){
Categoria categoria = (Categoria) value;
return categoria.getCodigo().toString();
}
return ;
}
}
JSF
<h:selectOneMenu id=categoria value=#{lancamentoBean.editado.categoria}>
<f:selectItems value=#{categoriaBean.categoriasSelect} />
</h:selectOneMenu>
Eu fiz seguinte o mesmo esquema veja o que da erro
Conversor
@FacesConverter(forClass=Polo.class)
public class PoloConverter implements Converter{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
System.out.println(entrei no converter 1 = + value );
Polo polo = new Polo();
if(value != null && value.trim().length() > 0 ){
Integer codigo = Integer.valueOf(value);
try{
PoloRN poloRN = new PoloRN();
polo = poloRN.carregar(codigo);
return polo;
}catch(Exception e){
throw new ConverterException(Não foi possível encontrar o polo de código + value + .+e.getMessage());
}
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
System.out.println(entrei no converter 2 = + value );
if (value != null){
Polo polo = (Polo) value;
return polo.getCodigoPolo().toString();
}
return ;
}
}
JSF
<p:selectOneMenu id=polo value=#{planilhaBean.acidenteSelecionado.polo} style=width:180px>
<f:selectItems value=#{poloBean.poloSelect}/>
</p:selectOneMenu>
GOSTEI 0
Jose Boas
29/03/2012
Consegui gravar, retirando do hascod e equals dos outro campos, deixando apenas somente o codigo do polo.
Vou fazer outros testes, depois se precisar eu retorno.
Vou fazer outros testes, depois se precisar eu retorno.
GOSTEI 0
Davi Costa
29/03/2012
Show de bola! O que precisar é só avisar.
att Davi
att Davi
GOSTEI 0
Jose Boas
29/03/2012
Agora aparecer outro problema, porque ao selecionar o polo tenho que colocar a empresa no SelectOneMenu, para selecionar voce me disse que é só listar o polo que vem a empresa, mas ela vem em uma Collection, pergunto com eu faço para colocar a coleção de empresadentro do select item
Ex de como eu faço em uma situação normal
public List<SelectItem> getPoloSelect() {
if(this.poloSelect == null){
this.poloSelect = new ArrayList<SelectItem>();
PoloRN poloRN = new PoloRN();
List<Polo> polo = poloRN.listar();
SelectItem item = null;
for (Polo pol : polo){
item = new SelectItem(pol,pol.getNome());
item.setEscape(false);
this.poloSelect.add(item);
}
}
return this.poloSelect;
}
Como colocar a empresa SelectItem
Ex de como eu faço em uma situação normal
public List<SelectItem> getPoloSelect() {
if(this.poloSelect == null){
this.poloSelect = new ArrayList<SelectItem>();
PoloRN poloRN = new PoloRN();
List<Polo> polo = poloRN.listar();
SelectItem item = null;
for (Polo pol : polo){
item = new SelectItem(pol,pol.getNome());
item.setEscape(false);
this.poloSelect.add(item);
}
}
return this.poloSelect;
}
Como colocar a empresa SelectItem
GOSTEI 0
Davi Costa
29/03/2012
Pelo que eu estou entendendo são dois combo box né?
vc vai pesquisar sobre ActionListener, pois ele espera um valor ser alterado para renderizar outro, tipo Estado e cidades
att Davi
vc vai pesquisar sobre ActionListener, pois ele espera um valor ser alterado para renderizar outro, tipo Estado e cidades
att Davi
GOSTEI 0
Jose Boas
29/03/2012
Isso mesmo, mas eu não sabia deste esquema de action listener, mas é este esquema mesmo, eu pego o polo e em outro combo lista as empresas e como funciona o action listener ?
att
José Luiz.
att
José Luiz.
GOSTEI 0
Davi Costa
29/03/2012
cara não tem muito mistério não,com poucopesquisa na net vc vai ver vários exemplos, vc inclusive pode usar ajax que é o ideal para minimizar o ciclo de vida do jsf.
Pq estou pedindo que pesquise, pois vai depender da versão do jsf q vc utiliza, da biblioteca de componentes que vc está usa..(primefaces, icefaces, richfaces e por ai vai). Vc não está usando nenhuma, recomendo urgente o uso de alguma.
Espero ter ajudado
att Davi
Pq estou pedindo que pesquise, pois vai depender da versão do jsf q vc utiliza, da biblioteca de componentes que vc está usa..(primefaces, icefaces, richfaces e por ai vai). Vc não está usando nenhuma, recomendo urgente o uso de alguma.
Espero ter ajudado
att Davi
GOSTEI 0
Jose Boas
29/03/2012
Blz já vi um exemplo. Obrigado.
GOSTEI 0
Jose Boas
29/03/2012
Eu vi alguns exemplo e tentei implementar, mas eu nao consigo passar o valor do polo selecionado no combo para a metodo que chama.Eu faço um verificao onde se for não nula entao executa.
public List<SelectItem> trocaEmpresaPolo(ValueChangeEvent event) {
System.out.println(Entrei no listener);
if (event.getNewValue() != event.getOldValue()) {
System.out.println(Vou chamar o polo select);
return getPoloEmpresaSelect();
}
return null;
}
public List<SelectItem> getPoloEmpresaSelect() {
System.out.println(Entrei para listar a empresa no combo);
SelectItem item = null;
System.out.println(Polo selecionado = + poloEditado.getNome());
if (this.poloEditado.getNome() != null) {
for (Empresa emp : this.poloEditado.getEmpresaList()){
System.out.println(Empresa listada = + emp.getNomeFantasia());
item = new SelectItem(emp,emp.getNomeFantasia());
item.setEscape(false);
this.poloEmpresaSelect.add(item);
}
}
return this.poloEmpresaSelect;
}
Meu jsf
Todos estes métodos estão no poloBean,mas onde eu gravo os dados que estão depois já inseridos é na planilhaBean.
Vou ter que fazer pelo poloBean, tudo ?
public List<SelectItem> trocaEmpresaPolo(ValueChangeEvent event) {
System.out.println(Entrei no listener);
if (event.getNewValue() != event.getOldValue()) {
System.out.println(Vou chamar o polo select);
return getPoloEmpresaSelect();
}
return null;
}
public List<SelectItem> getPoloEmpresaSelect() {
System.out.println(Entrei para listar a empresa no combo);
SelectItem item = null;
System.out.println(Polo selecionado = + poloEditado.getNome());
if (this.poloEditado.getNome() != null) {
for (Empresa emp : this.poloEditado.getEmpresaList()){
System.out.println(Empresa listada = + emp.getNomeFantasia());
item = new SelectItem(emp,emp.getNomeFantasia());
item.setEscape(false);
this.poloEmpresaSelect.add(item);
}
}
return this.poloEmpresaSelect;
}
Meu jsf
Todos estes métodos estão no poloBean,mas onde eu gravo os dados que estão depois já inseridos é na planilhaBean.
Vou ter que fazer pelo poloBean, tudo ?
GOSTEI 0
Jose Boas
29/03/2012
u vi alguns exemplo e tentei implementar, mas eu nao consigo passar o valor do polo selecionado no combo para a metodo que chama.Eu faço um verificao onde se for não nula entao executa.Eu sei o que é mas não sei como fazer, é que o polo selecionado no poloBean está nulo pois que esta polupado ao selecionar o combo é a da planilhaBean.
public List<SelectItem> trocaEmpresaPolo(ValueChangeEvent event) {
System.out.println(Entrei no listener);
if (event.getNewValue() != event.getOldValue()) {
System.out.println(Vou chamar o polo select);
return getPoloEmpresaSelect();
}
return null;
}
public List<SelectItem> getPoloEmpresaSelect() {
System.out.println(Entrei para listar a empresa no combo);
SelectItem item = null;
System.out.println(Polo selecionado = + poloEditado.getNome());
if (this.poloEditado.getNome() != null) {
for (Empresa emp : this.poloEditado.getEmpresaList()){
System.out.println(Empresa listada = + emp.getNomeFantasia());
item = new SelectItem(emp,emp.getNomeFantasia());
item.setEscape(false);
this.poloEmpresaSelect.add(item);
}
}
return this.poloEmpresaSelect;
}
Meu jsf
<p:selectOneMenu id=polo value=#{planilhaBean.acidenteSelecionado.polo} style=width:180px>
<f:selectItem itemLabel=Selecione o Polo itemValue=Nenhuma/>
<f:selectItems value=#{poloBean.poloSelect} var=polo itemValue=# itemLabel=#{polo.nome}/>
<p:ajax update=empresa Listener=#{poloBean.trocaEmpresaPolo} />
</p:selectOneMenu>
Todos estes métodos estão no poloBean,mas onde eu gravo os dados que estão depois já inseridos é na planilhaBean.
Vou ter que fazer pelo poloBean, tudo ?
public List<SelectItem> trocaEmpresaPolo(ValueChangeEvent event) {
System.out.println(Entrei no listener);
if (event.getNewValue() != event.getOldValue()) {
System.out.println(Vou chamar o polo select);
return getPoloEmpresaSelect();
}
return null;
}
public List<SelectItem> getPoloEmpresaSelect() {
System.out.println(Entrei para listar a empresa no combo);
SelectItem item = null;
System.out.println(Polo selecionado = + poloEditado.getNome());
if (this.poloEditado.getNome() != null) {
for (Empresa emp : this.poloEditado.getEmpresaList()){
System.out.println(Empresa listada = + emp.getNomeFantasia());
item = new SelectItem(emp,emp.getNomeFantasia());
item.setEscape(false);
this.poloEmpresaSelect.add(item);
}
}
return this.poloEmpresaSelect;
}
Meu jsf
<p:selectOneMenu id=polo value=#{planilhaBean.acidenteSelecionado.polo} style=width:180px>
<f:selectItem itemLabel=Selecione o Polo itemValue=Nenhuma/>
<f:selectItems value=#{poloBean.poloSelect} var=polo itemValue=# itemLabel=#{polo.nome}/>
<p:ajax update=empresa Listener=#{poloBean.trocaEmpresaPolo} />
</p:selectOneMenu>
Todos estes métodos estão no poloBean,mas onde eu gravo os dados que estão depois já inseridos é na planilhaBean.
Vou ter que fazer pelo poloBean, tudo ?
GOSTEI 0
Davi Costa
29/03/2012
altere o retorno desse método:
public List<SelectItem> trocaEmpresaPolo(ValueChangeEvent event) {
System.out.println(Entrei no listener);
if (event.getNewValue() != event.getOldValue()) {
System.out.println(Vou chamar o polo select);
return getPoloEmpresaSelect();
}
return null;
}
ele é void.. observe atentamente os exemplo que vc está seguindo.
Sim fica mais fácil vc deixar no mesmo bean... vc usa um mesmo serviço para fazer a mesma tarefa... colocando a regra de negócio em uma camada diferente da camada do managedbean. Assim vai ficar melhor a reutilização de código
att Davi
public List<SelectItem> trocaEmpresaPolo(ValueChangeEvent event) {
System.out.println(Entrei no listener);
if (event.getNewValue() != event.getOldValue()) {
System.out.println(Vou chamar o polo select);
return getPoloEmpresaSelect();
}
return null;
}
ele é void.. observe atentamente os exemplo que vc está seguindo.
Sim fica mais fácil vc deixar no mesmo bean... vc usa um mesmo serviço para fazer a mesma tarefa... colocando a regra de negócio em uma camada diferente da camada do managedbean. Assim vai ficar melhor a reutilização de código
att Davi
GOSTEI 0
Jose Boas
29/03/2012
Funcionou ,mudei para void como você falou e coloquei o preenchimento do com cidades no mesmo bean onde eu lança os dados e esta filé. Eu estava pecando pois achei que não era de praxis chamar em um mesmo bean prodimentos de regras de negócios distintas,
Creio que com isso finalizo este tópico.
Att
José Luiz.
Creio que com isso finalizo este tópico.
Att
José Luiz.
GOSTEI 0
Davi Costa
29/03/2012
Show de bola Jose Luiz! Foi notório seu avanço no aprendizado do JSF.
sucesso!
att Davi
sucesso!
att Davi
GOSTEI 0
Dyego Carmo
29/03/2012
Parabens :)
GOSTEI 0