我有两个表:CompteBancaire(idCompte,libelleCompte,montantCompte)
和Recette(idRecette,libelleRecette,MantantRecette,DateRecette,idCompte)
idCompte
是引用Compte
的外键。我有一个显示idRecette
,libelleRecette
,MantantRecette
,DateRecette
的DataTable,之后我想更新该行,以便我可以添加idCompte
。但我有一个问题,idCompte
没有得到更新。
09-Jun-2014 18:53:27.715 SEVERE [http-nio-8084-exec-58] com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError javax.faces.component.UpdateModelException: javax.el.ELException: /index.xhtml @69,72 value="#{recetteBean.recette.compte.idCompte}": Error writing 'idCompte' on type net.vo.Comptebancaire_$$_javassist_2
at javax.faces.component.UIInput.updateModel(UIInput.java:867)
at javax.faces.component.UIInput.processUpdates(UIInput.java:749)
at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1286)
at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1286)
at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1286)
at org.primefaces.component.dialog.Dialog.processUpdates(Dialog.java:375)
at javax.faces.component.UIForm.processUpdates(UIForm.java:281)
at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1286)
at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1286)
at javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1254)
at com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:78)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1015)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1575)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1533)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.el.ELException: /index.xhtml @69,72 value="#{recetteBean.recette.compte.idCompte}": Error writing 'idCompte' on type net.vo.Comptebancaire_$$_javassist_2
at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:139)
at javax.faces.component.UIInput.updateModel(UIInput.java:832)
... 37 more
Caused by: javax.el.ELException: Error writing 'idCompte' on type net.vo.Comptebancaire_$$_javassist_2
at javax.el.BeanELResolver.setValue(BeanELResolver.java:145)
at com.sun.faces.el.DemuxCompositeELResolver._setValue(DemuxCompositeELResolver.java:255)
at com.sun.faces.el.DemuxCompositeELResolver.setValue(DemuxCompositeELResolver.java:281)
at org.apache.el.parser.AstValue.setValue(AstValue.java:201)
at org.apache.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:260)
at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:131)
... 38 more
Caused by: java.lang.Exception
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:182)
at net.vo.Comptebancaire_$$_javassist_2.setIdCompte(Comptebancaire_$$_javassist_2.java)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at javax.el.BeanELResolver.setValue(BeanELResolver.java:134)
... 43 more
有我的代码。 recette.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<h:form id="form">
<p:dataTable id="listeRecettes" var="listeRecette" value="#{recetteBean.listeRecettes}" editable="true" style="margin-bottom:10px" rowKey="#{listeRecette.idRecette}" selection="#{recetteBean.recette}" selectionMode="single">
<f:facet name="header">
Liste des recettes
</f:facet>
<p:ajax event="rowEdit" listener="#{dtEditView.onRowEdit}" />
<p:ajax event="rowEditCancel" listener="#{dtEditView.onRowCancel}"/>
<p:column headerText="N° Recette">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{listeRecette.idRecette}" /></f:facet>
<f:facet name="input"><p:inputText id="modelInput" value="#{listeRecette.idRecette}" style="width:100%"/></f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Libellé Recette">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{listeRecette.libelleRecette}" /></f:facet>
<f:facet name="input"><p:inputText value="#{listeRecette.libelleRecette}" style="width:100%" label="Year"/></f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Montant Recette">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{listeRecette.montantRecette}" /></f:facet>
<f:facet name="input"><p:inputText value="#{listeRecette.montantRecette}" style="width:100%" label="Year"/></f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Date recette">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{listeRecette.dateRecette}" /></f:facet>
<f:facet name="input"><p:inputText value="#{listeRecette.dateRecette}" style="width:100%" label="Year"/></f:facet>
</p:cellEditor>
</p:column>
<p:column style="width:32px" headerText="Modification">
<p:rowEditor />
</p:column>
</p:dataTable>
<p:commandButton value="View" update="recetteDetail" icon="ui-icon-search" oncomplete="PF('recetteDialog').show()" styleClass="ui-priority-primary" />
<p:dialog header="Recette Info" widgetVar="recetteDialog" modal="true" showEffect="fade" hideEffect="fade" resizable="false">
<p:outputPanel id="recetteDetail" style="text-align:center;">
<p:panelGrid columns="2" rendered="#{not empty recetteBean.recette}" columnClasses="label,value">
<h:outputText value="Id:" />
<h:outputText value="#{recetteBean.recette.idRecette}" />
<h:outputText value="Libelle" />
<h:outputText value="#{recetteBean.recette.libelleRecette}" />
<h:outputText value="Date:" />
<h:outputText value="#{recetteBean.recette.dateRecette}" />
<h:outputText value="Montant:" />
<p:inputText value="#{recetteBean.recette.montantRecette}"/>
<h:outputText value="Compte Bancaire : " />
<p:inputText value="#{recetteBean.recette.compte.idCompte}"/>
<p:commandButton value="Valider" update="listeRecettes" icon="ui-icon-search" actionListener="#{recetteBean.update()}" styleClass="ui-priority-primary" />
</p:panelGrid>
</p:outputPanel>
</p:dialog>
</h:form>
</h:body>
</html>
CompteBancaireBean.java
package controller;
import java.util.List;
import javax.annotation.PostConstruct;
import model.services.ComptebancaireMetier;
import net.vo.Comptebancaire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
@Scope("view")
public class CompteBancaireBean implements java.io.Serializable{
@Autowired
private ComptebancaireMetier compteBancaireMetier;
private List<Comptebancaire> listeCompteBancaires;
private static int idCompte;
private String libelleCompte;
private Integer montantCompte;
@PostConstruct
public void init() {
listeCompteBancaires = compteBancaireMetier.getAllComptebancaires();
}
public static int submit()
{
System.out.println("compte"+idCompte);
return idCompte;
}
public List<Comptebancaire> getListeAnnees() {
listeCompteBancaires = compteBancaireMetier.getAllComptebancaires();
return listeCompteBancaires;
}
public void insert()
{
Comptebancaire compteBancaire = new Comptebancaire();
compteBancaire.setIdCompte(getIdCompte());
compteBancaire.setLibelleCompte(getLibelleCompte());
compteBancaire.setMontantCompte(getMontantCompte());
compteBancaireMetier.insert(compteBancaire);
}
public ComptebancaireMetier getCompteBancaireMetier() {
return compteBancaireMetier;
}
public void setCompteBancaireMetier(ComptebancaireMetier compteBancaireMetier) {
this.compteBancaireMetier = compteBancaireMetier;
}
public List<Comptebancaire> getListeCompteBancaires() {
return listeCompteBancaires;
}
public void setListeCompteBancaires(List<Comptebancaire> listeCompteBancaires) {
this.listeCompteBancaires = listeCompteBancaires;
}
public int getIdCompte() {
return idCompte;
}
public void setIdCompte(int idCompte) {
this.idCompte = idCompte;
}
public String getLibelleCompte() {
return libelleCompte;
}
public void setLibelleCompte(String libelleCompte) {
this.libelleCompte = libelleCompte;
}
public Integer getMontantCompte() {
return montantCompte;
}
public void setMontantCompte(Integer montantCompte) {
this.montantCompte = montantCompte;
}
}
RecetteBean.java
package controller;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.context.FacesContext;
import model.services.ComptebancaireMetier;
import model.services.RecetteMetier;
import net.vo.Comptebancaire;
import net.vo.Recette;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
@Scope("view")
public class RecetteBean {
@Autowired
private RecetteMetier recetteMetier;
private List<Recette> ListeRecettes;
private Recette recette;
private int idRecette;
private Comptebancaire compte;
private Date dateRecette;
private Integer montantRecette;
private String libelleRecette;
private ComptebancaireMetier comptebancaireMetier;
@PostConstruct
public void init() {
ListeRecettes = recetteMetier.getAllRecettes();
}
public Recette getRecette() {
return recette;
}
public void setRecette(Recette recette) {
this.recette = recette;
}
public void deleteRecette() {
ListeRecettes.remove(recette);
recette = null;
}
public RecetteMetier getRecetteMetier() {
return recetteMetier;
}
public void setRecetteMetier(RecetteMetier recetteMetier) {
this.recetteMetier = recetteMetier;
}
public List<Recette> getListeRecettes() {
return ListeRecettes;
}
public void setListeRecettes(List<Recette> ListeRecettes) {
this.ListeRecettes = ListeRecettes;
}
public int getIdRecette() {
return idRecette;
}
public void setIdRecette(int idRecette) {
this.idRecette = idRecette;
}
public Comptebancaire getCompte() {
return compte;
}
public void setCompte(Comptebancaire compte) {
this.compte = compte;
}
public Date getDateRecette() {
return dateRecette;
}
public void setDateRecette(Date dateRecette) {
this.dateRecette = dateRecette;
}
public Integer getMontantRecette() {
return montantRecette;
}
public void setMontantRecette(Integer montantRecette) {
this.montantRecette = montantRecette;
}
public String getLibelleRecette() {
return libelleRecette;
}
public void setLibelleRecette(String libelleRecette) {
this.libelleRecette = libelleRecette;
}
public void update()
{
Recette r = recetteMetier.getRecette(getRecette().getIdRecette());
r.setMontantRecette(getRecette().getMontantRecette());
System.out.println(getRecette().getCompte().getIdCompte());
r.setCompte(getRecette().getCompte());
recetteMetier.update(recette);
}
}