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:
packagebr.com.clinica.entity;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.NamedQuery;@NamedQuery(name="Especialidade.buscarTodos",query="select e from Especialidade e")@EntitypublicclassEspecialidade{@Id@GeneratedValue(strategy=GenerationType.AUTO)privateLongid;privateStringnome;privateStringdescricao;publicstaticfinalStringBUSCAR_TODOS="Especialidade.buscarTodos";publicStringgetDescricao(){returndescricao;}publicvoidsetDescricao(Stringdescricao){this.descricao=descricao;}publicLonggetId(){returnid;}publicvoidsetId(Longid){this.id=id;}publicStringgetNome(){returnnome;}publicvoidsetNome(Stringnome){this.nome=nome;}}
packagebr.com.clinica.mb;importjava.util.List;importjavax.faces.bean.ManagedBean;importjavax.faces.bean.ViewScoped;importbr.com.clinica.entity.Especialidade;importbr.com.clinica.entity.Medico;importbr.com.clinica.model.EspecialidadeBO;importbr.com.clinica.model.MedicoBO;@ManagedBean@ViewScopedpublicclassMedicoBean{privateMedicomedico=newMedico();privateList<Especialidade>listaEspecialidade;publicMedicoBean(){EspecialidadeBOespecialidadeBO=newEspecialidadeBO();this.listaEspecialidade=especialidadeBO.listar();}publicStringcadastra(){//System.out.println("cadastra() medico = " + medico.getNome());MedicoBOMedicoBO=newMedicoBO();MedicoBO.createOrUpdate(medico);return"sucesso";}publicList<Medico>getLista(){System.out.println("> getLista()");MedicoBOMedicoBO=newMedicoBO();returnMedicoBO.listar();}publicStringlistarTodos(){//vinculo para executar a acao render=tabela id=tabela // pretesto para rendererizar a tabelaSystem.out.println("> ListarTodos()");return"";}publicMedicogetMedico(){returnmedico;}publicvoidsetMedico(Medicomedico){this.medico=medico;}publicList<Especialidade>getListaEspecialidade(){returnlistaEspecialidade;}publicvoidsetListaEspecialidade(List<Especialidade>listaEspecialidade){this.listaEspecialidade=listaEspecialidade;}publicStringnovo(){medico=newMedico();return"";}publicStringexcluir(){MedicoBOmedicoBO=newMedicoBO();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"><htmlxmlns="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:panelheader="Cadastro de Medico"id="painel"><table><tr><td>Nome:</td><td><h:inputTextvalue="#{medicoBean.medico.nome}"/></td></tr><tr><td>E-mail:</td><td><h:inputTextvalue="#{medicoBean.medico.email}"/></td></tr><tr><td>Senha:</td><td><h:inputSecretvalue="#{medicoBean.medico.senha}"/></td></tr><tr><td>Especialidades:</td><td><h:selectManyListboxvalue="#{medicoBean.medico.listaEspecialidade}"size="5"><f:selectItemsvalue="#{medicoBean.listaEspecialidade}"var="especialidade"itemValue="#{especialidade}"itemLabel="#{especialidade.nome}"/></h:selectManyListbox></td></tr><tr><tdcolspan="2"><h:commandButtonvalue="Enviar"action="#{medicoBean.cadastra}"/><h:commandButtonaction="/menu"value="Voltar para o menu"/><h:commandButtonaction="#{medicoBean.novo}"value="Novo"/><a4j:commandButtonvalue="Listar medicos"action="#{medicoBean.listarTodos}"render="tabela"/><h:commandButtonaction="#{medicoBean.excluir}"value="Excluir"></h:commandButton></td></tr></table><h:outputTextid="resultado"value="#{medico.mensagem}"/><rich:dataTableid="tabela"var="med"value="#{medicoBean.lista}"><rich:column><f:facetname="header"><h:outputTextValue="Nome"/></f:facet><h:outputTextvalue="#{med.nome}"/></rich:column><rich:column><f:facetname="header"><h:outputTextValue="E-mail"/></f:facet><h:outputTextvalue="#{med.email}"/></rich:column><rich:column><f:facetname="header"><h:outputTextValue="Editar"/></f:facet><h:commandLinkvalue="Editar"action="editar"><f:setPropertyActionListenervalue="#{med}"target="#{medicoBean.medico}"/></h:commandLink></rich:column></rich:dataTable></rich:panel></a4j:region></h:form></h:body></f:view></html>
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"