Re:dúvida JSF selectManyListbox

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?

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]

Por favor, posta o Usuario.

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.

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!

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!

Entidade Especialidade:

[code]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;
}

}[/code]

Medico:

[code]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 listaEspecialidade;

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

public void setListaEspecialidade(List<Especialidade> listaEspecialidade) {
	this.listaEspecialidade = listaEspecialidade;
}

}[/code]

MedicoBean (ManagedBean):

[code]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 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 "";
}

}[/code]

E, a view:

[code]

<h:head>
CADASTRO DE Medico
</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>

[/code]

Usuario:

[code]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;
}

}[/code]

Boa tarde!

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

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:

[code]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());
}

}[/code]

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!