Re:dúvida JSF selectManyListbox

10 respostas
gmmascarin

Para quem está iniciando indico esse material: http://www.k19.com.br/downloads/apostilas/java/k19-k12-desenvolvimento-web-com-jsf2-e-jpa2

Sobre o seu problema: No seu entityBean Especialidade, declarou o @Id com os gets/sets? A anotação @entity foi adicionada na classe?

10 Respostas

gmmascarin

Victor, Se quiser ajuda, posta o código completo. Fica mais fácil.
Antes, segue dois pontos a serem observados:

[list]Por se tratar de um relacionamento ManyToMany será preciso de uma tabela de junção. Qual é essa tabela?[/list]
[list]O relacionamento está representado nas duas entidades, ou seja, é bidirecional? mappedBy foi definido?[/list]

gmmascarin

Por favor, posta o Usuario.

gmmascarin

Victor, você está usando herança de JPA. Para isso deverá escolher a melhor estratégia para seu negócio. Dê uma olhada em Single Table, Joined e Table per class.

Também confira se sua base tem a tabela Medico_Especialidade. Da maneira como está seu mapeamento essa tabela se faz necessário para satisfazer o relacionamento ManyToMany.

Victor_Yuji_Maehira

Oi pessoal!

Estou tentando implementar um CRUD em JSF e JPA.

Tenho uma entidade Medico que tem uma relação ManyToMany com a entidade Especialidade (ex: cardiologia, pediatria, etc).

Parte da entidade Medico:

@Entity public class Medico extends Usuario{ @ManyToMany private List<Especialidade> listaEspecialidade;

Parte do managedBean:

@ManagedBean @ViewScoped public class MedicoBean { private Medico medico = new Medico(); private List<Especialidade> listaEspecialidade; ... public String cadastra() { MedicoBO MedicoBO = new MedicoBO(); MedicoBO.createOrUpdate(medico); return "sucesso"; }
Parte da View:

<h:selectManyListbox value="#{medicoBean.medico.listaEspecialidade}" size="5"> <f:selectItems value="#{medicoBean.listaEspecialidade}" var="especialidade" itemValue="#{especialidade}" itemLabel="#{especialidade.nome}" /> </h:selectManyListbox>
Ao tentar salvar, é este o erro: “javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of br.com.clinica.entity.Especialidade.id

Se alguém tiver um tutorial para indicar, será muito bem vindo.
Obrigado!

Victor_Yuji_Maehira

Bom dia mascarim!

A entidade Especialidade tem seu Id e getters and setters:

@Entity public class Especialidade { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id;

Vou ter esse pdf com mais calma!
Valeu!

Victor_Yuji_Maehira
Entidade Especialidade:
package br.com.clinica.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;


@NamedQuery(name="Especialidade.buscarTodos",
		query="select e from Especialidade e") 
@Entity
public class Especialidade {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
	private String nome;
	private String descricao;
	public static final String BUSCAR_TODOS = "Especialidade.buscarTodos";
	public String getDescricao() {
		return descricao;
	}

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

	public Long getId() {
		return id;
	}

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

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}
}
Medico:
package br.com.clinica.entity;

import java.util.List;

import javax.persistence.Entity;
import javax.persistence.ManyToMany;

@Entity
public class Medico extends Usuario{	
	@ManyToMany
	private List<Especialidade> listaEspecialidade;

	public List<Especialidade> getListaEspecialidade() {
		return listaEspecialidade;
	}

	public void setListaEspecialidade(List<Especialidade> listaEspecialidade) {
		this.listaEspecialidade = listaEspecialidade;
	}
}
MedicoBean (ManagedBean):
package br.com.clinica.mb;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.clinica.entity.Especialidade;
import br.com.clinica.entity.Medico;
import br.com.clinica.model.EspecialidadeBO;
import br.com.clinica.model.MedicoBO;


@ManagedBean
@ViewScoped
public class MedicoBean {
	private Medico medico = new Medico();
	private List<Especialidade> listaEspecialidade;
	
	public MedicoBean() {
		EspecialidadeBO especialidadeBO = new EspecialidadeBO();
		this.listaEspecialidade = especialidadeBO.listar();
	}
	
	public String cadastra() {
		//System.out.println("cadastra() medico = " + medico.getNome());
		MedicoBO MedicoBO = new MedicoBO();
		MedicoBO.createOrUpdate(medico);
		return "sucesso";
	}
	
	public List<Medico> getLista(){
		System.out.println("> getLista()");
		MedicoBO MedicoBO = new MedicoBO();
		return MedicoBO.listar();
	}
	
	public String listarTodos(){//vinculo para executar a acao render=tabela id=tabela // pretesto para rendererizar a tabela
		System.out.println("> ListarTodos()");
		return "";
	}

	public Medico getMedico() {
		return medico;
	}

	public void setMedico(Medico medico) {
		this.medico = medico;
	}

	public List<Especialidade> getListaEspecialidade() {
		return listaEspecialidade;
	}

	public void setListaEspecialidade(List<Especialidade> listaEspecialidade) {
		this.listaEspecialidade = listaEspecialidade;
	}
	
	public String novo() {
		medico = new Medico();
		return "";
	}
	
	public String excluir () {
		MedicoBO medicoBO = new MedicoBO();
		medicoBO.remove(medico);
		return "";
	}
}
E, a view:
<!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:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:rich="http://richfaces.org/rich"
	xmlns:a4j="http://richfaces.org/a4j">

<h:head>
	<title>CADASTRO DE Medico</title>
</h:head>

<f:view>

	<h:body>
		<h:form>
			<a4j:region>
				<rich:panel header="Cadastro de Medico" id="painel">
					<table>
						<tr>
							<td>Nome:</td>
							<td><h:inputText value="#{medicoBean.medico.nome}" /></td>
						</tr>
						<tr>
							<td>E-mail:</td>
							<td><h:inputText value="#{medicoBean.medico.email}" /></td>
						</tr>
						<tr>
							<td>Senha:</td>
							<td><h:inputSecret value="#{medicoBean.medico.senha}" /></td>
						</tr>
						<tr>
							<td>Especialidades:</td>
							<td><h:selectManyListbox
								value="#{medicoBean.medico.listaEspecialidade}" size="5">
								<f:selectItems value="#{medicoBean.listaEspecialidade}"
									var="especialidade" itemValue="#{especialidade}"
									itemLabel="#{especialidade.nome}" />
							</h:selectManyListbox></td>
						</tr>
						<tr>
							<td colspan="2"><h:commandButton value="Enviar"
								action="#{medicoBean.cadastra}" /> <h:commandButton
								action="/menu" value="Voltar para o menu" /> <h:commandButton
								action="#{medicoBean.novo}" value="Novo" /> <a4j:commandButton
								value="Listar medicos" action="#{medicoBean.listarTodos}"
								render="tabela" /> <h:commandButton
								action="#{medicoBean.excluir}" value="Excluir"></h:commandButton>
							</td>
						</tr>
					</table>
					<h:outputText id="resultado" value="#{medico.mensagem}" />

				
					<rich:dataTable id="tabela" var="med" value="#{medicoBean.lista}">
						<rich:column>
							<f:facet name="header">
								<h:outputText Value="Nome" />
							</f:facet>
							<h:outputText value="#{med.nome}" />
						</rich:column>
						<rich:column>
							<f:facet name="header">
								<h:outputText Value="E-mail" />
							</f:facet>
							<h:outputText value="#{med.email}" />
						</rich:column>

						<rich:column>
							<f:facet name="header">
								<h:outputText Value="Editar" />
							</f:facet>
							<h:commandLink value="Editar" action="editar">
								<f:setPropertyActionListener value="#{med}"
									target="#{medicoBean.medico}" />
							</h:commandLink>
						</rich:column>
					</rich:dataTable>

				</rich:panel>
			</a4j:region>
		</h:form>
	</h:body>
</f:view>

</html>
Victor_Yuji_Maehira
Usuario:
package br.com.clinica.entity;

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

@Entity
public class Usuario {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int id;
	private String email;
	private String senha;
	private String nome;
	
	public String getSenha() {
		return senha;
	}
	public void setSenha(String senha) {
		this.senha = senha;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
}
Victor_Yuji_Maehira

Boa tarde!

A “mágica” está no @FacesConverter. Vou tentar aqui!

Victor_Yuji_Maehira

Fiz o converter abaixo e implementei o equals e hashCode em Especialidade. A persistência funciona, o conteúdo é salvo no banco. Mas, ao abrir para edição, ao tentar salvar tomo o famoso "org.hibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed"

Fonte do converter:

package br.com.clinica.converter;

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

import br.com.clinica.entity.Especialidade;
import br.com.clinica.model.EspecialidadeBO;

@FacesConverter(forClass = Especialidade.class, value="EspecialidadeConverter")
public class EspecialidadeConverter implements Converter {

	@Override
	public Object getAsObject(FacesContext arg0, UIComponent arg1, String string) {
		System.out.println(">getAsObject " + string);
		if(string == null || string.isEmpty()) return null;
		Long id = Long.valueOf(string);
		Especialidade especialidade = new EspecialidadeBO().busca(id);
		return especialidade;
	}

	@Override
	public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
		Especialidade especialidade = (Especialidade) arg2;
		if (especialidade == null || especialidade.getId() == null)
			return null;
		System.out.println("getAsString = " + String.valueOf(especialidade.getId()));
		return String.valueOf(especialidade.getId());
	}

}
Victor_Yuji_Maehira

Problema do “org.hibernate.LazyInitilizationException: failed to lazily initialize a collection, no session or session was closed” resolvido colocando

dentro do selectManyListbox.

Achei a solução neste fórum: http://stackoverflow.com/questions/8802854/lazyinitializationexception-with-cdi-managed-bean-and-stateful-session-bean

Fica registrado! Obrigado!

Criado 4 de março de 2013
Ultima resposta 17 de mar. de 2013
Respostas 10
Participantes 2