Falaê Galera!
Já dei uma pesquisada aqui no forum antes… mas não achei um problema parecido igual esse meu.
Seguinte:
Preciso fazer um módulo de agendamento de consultas em um sistema que eu estou fazendo, nele eu coloco uma string que é o nome do paciente, instancio uma lista de médicos dentro de uma combobox pra selecionar qual será o médico da consulta, e tenho o campo pra data, pra hora e o status… aí ele inclui normalmente e aparece na lista e remove normalmente, ou seja, o id está sendo carregado… o que eu estou achando estranho que quando eu clico pra alterar ele carrega o form com os dados do agendamento normalmente, mas quando eu clico em alterar ele dá o seguinte erro:
java.lang.IllegalArgumentException: id to load is required for loading
org.hibernate.event.LoadEvent.<init>(LoadEvent.java:89)
org.hibernate.event.LoadEvent.<init>(LoadEvent.java:61)
org.hibernate.impl.SessionImpl.load(SessionImpl.java:974)
org.hibernate.impl.SessionImpl.load(SessionImpl.java:970)
br.com.sisclinic.dao.AgendaConsultaDAO.carregaAgendamento(AgendaConsultaDAO.java:50)
br.com.sisclinic.controller.AgendaConsultaController.edita(AgendaConsultaController.java:62)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:86)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.sisclinic.interceptor.NoCacheInterceptor.intercept(NoCacheInterceptor.java:41)
br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.sisclinic.interceptor.AccesControllerInterceptor.intercept(AccesControllerInterceptor.java:53)
br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:48)
br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
Minhas Classes:
AgendaConsulta:
@Entity
public class AgendaConsulta {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_agendaconsulta")
private Long id;
private String paciente;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
private Medico medico;
@Temporal(TemporalType.DATE)
@DateTimeFormat(pattern = "dd/MM/yyyy")
@Column(name = "data_consulta")
private Date dataConsulta;
@Column(name = "hora_consulta")
private String horaConsulta;
@Column(name = "status_consulta")
private String statusConsulta; //Agendada, Cancelada, Realizada
//Construtores, Getters e Setters
}
AgendaConsultaDAO:
@Component
@RequestScoped
public class AgendaConsultaDAO {
//...
public void atualiza(AgendaConsulta agendaConsulta) {
Transaction tx = session.beginTransaction();
session.update(agendaConsulta);
tx.commit();
}
@SuppressWarnings("unchecked")
public List<AgendaConsulta> listaAgendamentos() {
return session.createCriteria(AgendaConsulta.class).list();
}
public AgendaConsulta carregaAgendamento(Long id) {
return (AgendaConsulta) this.session.load(AgendaConsulta.class, id);
}
//...
}
AgendaConsultaController:
@Resource
@Roles(roles = "admin")
public class AgendaConsultaController {
private Result result;
private Validator validator;
private AgendaConsultaDAO agendaConsultaDAO;
private MedicoDAO medicoDAO;
public AgendaConsultaController(Result result, Validator validator,
AgendaConsultaDAO agendaConsultaDAO, MedicoDAO medicoDAO) {
this.result = result;
this.validator = validator;
this.agendaConsultaDAO = agendaConsultaDAO;
this.medicoDAO = medicoDAO;
}
@Path("/agendaConsulta")
public void lista() {
result.include("agendaConsultas", agendaConsultaDAO.listaAgendamentos());
}
public AgendaConsulta edita(Long id) {
result.include("medicos", medicoDAO.listaMedicos());
return agendaConsultaDAO.carregaAgendamento(id);
}
public void atualiza(final AgendaConsulta agendaConsulta) {
validator.checking(new Validations() {{
that(!agendaConsulta.getPaciente().trim().isEmpty(),
"agendaConsulta.paciente", "pacienteAgendaConsulta.vazio");
that(agendaConsulta.getMedico().getId() != null,
"agendaConsulta.medico.pessoa.nome", "nomePessoa.vazio");
that(agendaConsulta.getDataConsulta() != null,
"agendaConsulta.dataConsulta", "dataConsulta.vazio");
that(!agendaConsulta.getHoraConsulta().trim().isEmpty(),
"agendaConsulta.horaConsulta", "horaAgendaConsulta.vazio");
that(!agendaConsulta.getStatusConsulta().trim().isEmpty(),
"agendaConsulta.statusConsulta", "statusAgendaConsulta.vazio");
}});
validator.onErrorRedirectTo(this).edita(agendaConsulta.getId());
agendaConsultaDAO.atualiza(agendaConsulta);
result.include("mensagem", "Agendamento atualizado com sucesso!");
result.use(Results.logic()).redirectTo(AgendaConsultaController.class).lista();
}
}
edita.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<h3 align="center">Alterar Agendamento</h3>
<c:forEach var="error" items="${errors}">
<li>${error.message}</li>
</c:forEach>
<form action="atualiza" method="post">
<input type="hidden" name="agendaConsulta.id" value="agendaConsulta.id" />
<p>Nome do Paciente:<br />
<input type="text" name="agendaConsulta.paciente" maxlength="70" size="70" value="${agendaConsulta.paciente}" /></p>
<p>Médico: <br/>
<select name="agendaConsulta.medico.id">
<option value="${agendaConsulta.medico.pessoa.id}">${agendaConsulta.medico.pessoa.nome}</option>
<c:forEach var="medico" items="${medicos}">
<option <c:if test="${agendaConsulta.medico.pessoa.id == medico.pessoa.id}"> selected="selected"</c:if>
value="${medico.pessoa.id}">${medico.pessoa.nome}</option>
</c:forEach>
</select></p>
<p>Data da Consulta: <label class="exlabel">Ex: 01/01/2010</label><br />
<input type="text" name="agendaConsulta.dataConsulta" maxlength="10" size="10"
value="<fmt:formatDate pattern='dd/MM/yyyy' value="${agendaConsulta.dataConsulta}"/>" /></p>
<p>Hora da Consulta: <label class="exlabel">Ex: 14:00h</label><br />
<input type="text" name="agendaConsulta.horaConsulta" maxlength="6" size="6" value="${agendaConsulta.horaConsulta}" /></p>
<p>Status da Consulta:<br />
<select name="agendaConsulta.statusConsulta">
<option></option>
<option>Agendada</option>
<option>Cancelada</option>
<option>Realizada</option>
</select></p>
<input type="submit" value="Alterar" />
</form>