2013-04-30 59 views
1

我想問你一個幫助,因爲我堅持以下問題。另一件事我一開始就要說的是我在JSF開發中是一個非常新的東西。PrimeFaces DataTable列表顯示和選擇

我正在使用JSF,PrimeFaces,Hibernate和PostgreSQL。

現在我正在爲新用戶註冊表單。這個測試應用程序由四頁組成。第一個包含基本的靜態信息,第二個頁面是用於填寫用戶主要信息的表單,第三個頁面用戶將選擇免費期限(這是我的問題!),最後一個將是概括和按鈕,用於保存所有填充或選擇的信息。

第三頁:

下面是數據表與無線電覆選框和單選一個PrimeFaces。我跟着PrimeFaces show caseBalusC's Datatables tutorial。問題 與數據庫不可能顯示填充列表。主要問題是與財產私人CollectionTerm selectedTerm哪裏應該存儲選定的行。

錯誤日誌

[javax.el.ELException: Error reading 'dataList' on type de.ibmt.upb.model.CollectionTerm] with root cause 
org.postgresql.util.PSQLException: ERROR: column collection0_.selectedterm does not exist 
    Position: 78 
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2157) 
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1886) 
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:555) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:417) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:302) 
    at sun.reflect.GeneratedMethodAccessor38.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122) 
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) 
    at com.sun.proxy.$Proxy25.executeQuery(Unknown Source) 
    at org.hibernate.loader.Loader.getResultSet(Loader.java:2031) 
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1832) 
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1811) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:899) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341) 
    at org.hibernate.loader.Loader.doList(Loader.java:2516) 
    at org.hibernate.loader.Loader.doList(Loader.java:2502) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2332) 
    at org.hibernate.loader.Loader.list(Loader.java:2327) 
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:490) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195) 
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1247) 
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101) 
    at de.ibmt.upb.model.CollectionTerm.loadDataList(CollectionTerm.java:90) 
    at de.ibmt.upb.model.CollectionTerm.getDataList(CollectionTerm.java:83) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:87) 
    at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67) 
    at org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:169) 
    at org.apache.el.parser.AstValue.getValue(AstValue.java:183) 
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185) 
    at org.apache.myfaces.view.facelets.el.ContextAwareTagValueExpression.getValue(ContextAwareTagValueExpression.java:96) 
    at javax.faces.component._DeltaStateHelper.eval(_DeltaStateHelper.java:246) 
    at javax.faces.component.UIData.getValue(UIData.java:2028) 
    at org.primefaces.component.datatable.DataTable.getValue(DataTable.java:867) 
    at org.primefaces.component.api.UIData.getDataModel(UIData.java:579) 
    at org.primefaces.component.api.UIData.setRowModel(UIData.java:409) 
    at org.primefaces.component.api.UIData.setRowIndex(UIData.java:401) 
    at javax.faces.component.UIData.encodeEnd(UIData.java:1690) 
    at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:63) 
    at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:47) 
    at org.primefaces.component.fieldset.FieldsetRenderer.encodeContent(FieldsetRenderer.java:90) 
    at org.primefaces.component.fieldset.FieldsetRenderer.encodeMarkup(FieldsetRenderer.java:72) 
    at org.primefaces.component.fieldset.FieldsetRenderer.encodeEnd(FieldsetRenderer.java:46) 
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:580) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:762) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:758) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:758) 
    at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1900) 
    at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:285) 
    at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:115) 
    at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:241) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:199) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

管理的bean:

@ManagedBean 
@Entity 
@Table(name="COLLECTION_TABLE") 
public class CollectionTerm implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    private Integer c_id; 
    private Date dateCollection; 
    private Time timeCollection; 

    @OneToMany(mappedBy="coll") 
    private Collection<UserDetails> userDetails = new ArrayList<UserDetails>(); 

    @ElementCollection(targetClass=CollectionTerm.class) 
    private List<CollectionTerm> dataList; 

    private CollectionTerm selectedTerm; 

    public CollectionTerm() { 

    } 

     ///// getters and setters ///// 

    public List<CollectionTerm> getDataList() { 
     if (FacesContext.getCurrentInstance().getRenderResponse()) { 
       loadDataList(); 
     } 
     return dataList; 
    } 

    private void loadDataList() { 
     Session session = HibernateUtil.getSessionFactory().openSession(); 
     dataList = session.createQuery("from CollectionTerm").list(); 
    } 

} 

JSF:

<h:form id="collection"> 
    <p:fieldset legend="Date and time"> 
     <p:dataTable id="collection" value="#{coll.dataList}" var="coll" rowKey="#{coll.c_id}" selection="coll.selectedTerm"> 
      <p:column selectionMode="single" style="width:2%" /> 
      <p:column > 
       #{coll.timeCollection} 
      </p:column> 
      <p:column> 
       #{coll.dateCollection} 
      </p:column> 
      <p:column> 
       #{coll.c_id} 
      </p:column> 
     </p:dataTable> 
     <p:commandButton value="Back" action="registrationback" ajax="false" /> 
     <p:commandButton value="Next" action="recap" ajax="false" /> 
     <p:commandButton value="Test" action="testcollection" ajax="false" /> 
    </p:fieldset> 
</h:form> 

面 - 配置:

<managed-bean> 
    <managed-bean-name>coll</managed-bean-name> 
    <managed-bean-class>de.ibmt.upb.model.CollectionTerm</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
</managed-bean> 

<managed-bean> 
    <managed-bean-name>userService</managed-bean-name> 
    <managed-bean-class>de.ibmt.upb.model.UserDetails</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
    <managed-property> 
     <property-name>term</property-name> 
     <value>#{term}</value> 
    </managed-property> 
    <managed-property> 
     <property-name>coll</property-name> 
     <value>#{coll}</value> 
    </managed-property> 
</managed-bean> 

我在做什麼錯了?

感謝您的任何答覆或建議!

回答

0

org.hibernate.exception.SQLGrammarException: ERROR: column collection0_.selectedterm does not exist

這是你的根本原因。您需要首先解決映射/數據庫錯誤。然後

  1. 作爲最佳實踐和可用性的問題,不要將您的JPA實體和JSF託管Bean結合在一起。這意味着@ManagedBean@Entity不應該在同一個POJO中聲明。您的bean應該是模型或控制器,而不是兩者。

  2. 使用@ManagedBean註釋或faces-config.xml文件,而不是兩者。儘管該文件在註釋上優先(我相信),但它最終會導致混淆

+0

謝謝你的幫助。對於遲到的反饋抱歉。我把以前的豆分成兩個分開,現在更清晰了。但我有另一個問題。隨着PrimeFaces數據表與無線電覆選框的設置,返回給我這個錯誤:javax.el.PropertyNotFoundException:**在'類型java.lang.String **找不到'屬性'c_id'現在,我真的不知道我應該改變。但可能很難僅從這個錯誤信息中說出。 – PrincAm 2013-05-02 12:11:52

+0

@PrincAm,你需要發佈另一個完整的問題才能得到明確的答案,但我最好的猜測是你有JSF轉換相關的問題 – kolossus 2013-05-02 14:37:53

0

實體bean應該只是表的反映。每列應映射到列名稱。一旦你構造了實體bean,你可以調用它並獲得期望的結果。

@Entity 
@Table(name="COLLECTION_TABLE") 
public class CollectionTerm implements Serializable { 
.. 
.. 
.. 
@Id 
     @Column(name = "c_id") 
     private Integer c_id; 
     @Column(name = "date") 
     private Date dateCollection; 
     @Column(name = "time") 
     private Time timeCollection; 
... 
.. 

} 

上面的東西匹配您的基礎表結構。這應該給你一個良好的開端。

+0

感謝您的解釋和建議! – PrincAm 2013-05-02 12:14:01