Boa noite pessoal!!
Estou lutando aqui com JPA, não estou conseguindo resolver este problema de relacionamento de tabelas.
Pedido e cliente - Um pedido pertence a apenas um cliente e um cliente faz muitos pedidos.
Quando vou gravar aparece uma messagem dizendo que o campo está nulo, mas não estou conseguindo resolver.
Me ajudem pq estou apanhando.
Obrigado.
package br.com.proj.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
public class Pedido {
@Id
@GeneratedValue
private long id;
/*
* Um pedido pertence a apenas um cliente e um cliente faz muitos pedidos.
*/
@ManyToOne
private Cliente cliente;
private Long numped;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Cliente getCliente() {
return cliente;
}
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}
public Long getNumped() {
return numped;
}
public void setNumped(Long numped) {
this.numped = numped;
}
}
public void inserir(Pedido pedido){
manager.getTransaction().begin();
manager.persist(pedido);
manager.getTransaction().commit();
}
package br.com.proj.control;
import javax.faces.bean.ManagedBean;
import br.com.proj.dao.PedidoDao;
import br.com.proj.model.Cliente;
import br.com.proj.model.Pedido;
@ManagedBean
public class PedidoControl {
private Cliente cliente;
private PedidoDao pedidoDao;
private Pedido pedido;
public String inserir(){
pedido = new Pedido();
pedido.setCliente(cliente);
pedido.setNumped(pedido.getNumped());
pedidoDao.inserir(pedido);
return null;
}
public Cliente getCliente() {
return cliente;
}
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}
public PedidoDao getPedidoDao() {
return pedidoDao;
}
public void setPedidoDao(PedidoDao pedidoDao) {
this.pedidoDao = pedidoDao;
}
public Pedido getPedido() {
return pedido;
}
public void setPedido(Pedido pedido) {
this.pedido = pedido;
}
}
<rich:panel style="width:500px;">
<f:facet name="header">
<center>
<h:outputText value="Pedidos" />
</center>
</f:facet>
<h:panelGrid columns="2">
<h:outputText value="Cliente" />
<h:inputText value="#{pedidoControl.cliente.nome}" />
<h:outputText value="Pedido" />
<h:inputText value="#{PedidoControl.pedido.numped}" />
<h:commandButton action="#{pedidoControl.inserir}"value="Inserir" />
</h:panelGrid>
</rich:panel>
ERRO
Grave: Servlet.service() for servlet [Faces Servlet] in context with path [/proj] threw exception [/pedido.xhtml @27,72 value="#{pedidoControl.cliente.nome}": Target Unreachable, 'cliente' returned null] with root cause
javax.el.PropertyNotFoundException: /pedido.xhtml @27,72 value="#{pedidoControl.cliente.nome}": Target Unreachable, 'cliente' returned null
at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100)
at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:95)
at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1030)
at javax.faces.component.UIInput.validate(UIInput.java:960)
at javax.faces.component.UIInput.executeValidate(UIInput.java:1233)
at javax.faces.component.UIInput.processValidators(UIInput.java:698)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
at javax.faces.component.UIForm.processValidators(UIForm.java:253)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1172)
at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Seu erro é de JSF e não de JPA.
javax.el.PropertyNotFoundException: /pedido.xhtml @27,72 value="#{pedidoControl.cliente.nome}": Target Unreachable, ‘cliente’ returned null
Isso quer dizer que o método getCliente está retornando null.
faça algo do tipo assim:[code]public Carro getCarro(){
if(carro == null){
carro = new Carro();
}
return carro;
}
[/code]
Boa noite!
Obrigado pela atenção, fiz a alteração como você me indicou mas está voltando o mesmo erro.
public Cliente getCliente() {
if (cliente == null) {
cliente = new Cliente();
}
return cliente;
}
Grave: Servlet.service() for servlet [Faces Servlet] in context with path [/proj] threw exception [/pedido.xhtml @27,60 value="#{pedidoControl.cliente.nome}": Target Unreachable, 'cliente' returned null] with root cause
javax.el.PropertyNotFoundException: /pedido.xhtml @27,60 value="#{pedidoControl.cliente.nome}": Target Unreachable, 'cliente' returned null
at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100)
at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:95)
at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1030)
at javax.faces.component.UIInput.validate(UIInput.java:960)
at javax.faces.component.UIInput.executeValidate(UIInput.java:1233)
at javax.faces.component.UIInput.processValidators(UIInput.java:698)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
at javax.faces.component.UIForm.processValidators(UIForm.java:253)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1172)
at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Posta o ManagedBean todo? Só ele está bom.
Não será porque você está retornando null no método inserir da classe PedidoControl? Se não vai retornar nada, não seria melhor usar um método void?
@ManagedBean
public class PedidoControl {
private Cliente cliente;
private PedidoDao pedidoDao;
private Pedido pedido;
public String inserir(){
pedido = new Pedido();
pedido.setCliente(cliente);
pedido.setNumped(pedido.getNumped());
pedidoDao.inserir(pedido);
return null;
}
...
}
Bom dia Hebert, meu Bean de pedido é somente isto. Estou fazendo o teste somente de inserção.
Agora meu mvc de cliente está completo, comecei a usar jpa tem alguns dias, mas estou apanhando.
Eu somente não entendo por que esta voltando este valor nullo, sendo que existe o cliente cadastrado.
Obrigado.
[quote=romarcio]Não será porque você está retornando null no método inserir da classe PedidoControl? Se não vai retornar nada, não seria melhor usar um método void?
[code]
@ManagedBean
public class PedidoControl {
private Cliente cliente;
private PedidoDao pedidoDao;
private Pedido pedido;
public String inserir(){
pedido = new Pedido();
pedido.setCliente(cliente);
pedido.setNumped(pedido.getNumped());
pedidoDao.inserir(pedido);
return null;
}
…
}
[/code][/quote]
Bom dia Romarcio, não preciso alterar p\ void por que meu dao está com Dao, estou utilizando camadas.
Obrigado pela dica, se estiver errado me mostre seu ponto de vista por favor.
Mas o retorno null não tem nada haver com o DAO. Mas com seu MBean. Eu não entendo muito de JSF, mas acho que se você retornar um valor null depois de uma requisição, o bean vai enviar um valor null para sua pagina e você não vai conseguir renderiza-la.
Veja nessa linha: javax.el.PropertyNotFoundException: /pedido.xhtml @27,60 value="#{pedidoControl.cliente.nome}": Target Unreachable, 'cliente' returned null
Não se trata do DAO se trata da página.
[quote=romarcio]Mas o retorno null não tem nada haver com o DAO. Mas com seu MBean. Eu não entendo muito de JSF, mas acho que se você retornar um valor null depois de uma requisição, o bean vai enviar um valor null para sua pagina e você não vai conseguir renderiza-la.
Veja nessa linha: javax.el.PropertyNotFoundException: /pedido.xhtml @27,60 value="#{pedidoControl.cliente.nome}": Target Unreachable, 'cliente' returned null
Não se trata do DAO se trata da página.[/quote]
Quando você postou a dica, eu fiz o teste voltou a mesma mensagem.
Realmente não sei o que pode ser.
Ok, então não era isso mesmo. Mas mesmo assim te aconselho a usar void. Não tem porque usar retorno String como null se não vai retornar nada.
[quote=romarcio]Ok, então não era isso mesmo. Mas mesmo assim te aconselho a usar void. Não tem porque usar retorno String como null se não vai retornar nada.
[/quote]
Obrigado pela dica, caso tenha alguma idéia ou alguém que passou por este caso por favor poste aqui no forum.
vlw mesmo!!
Tenta fazer assim:
public void inserir(){
pedido = new Pedido();
pedido.setCliente(cliente);
pedido.setNumped(pedido.getNumped());
pedidoDao.inserir(pedido);
cliente = pedido.getCliente();
}