【问题标题】:PrimeFaces DataTable list display and selectionPrimeFaces DataTable 列表显示和选择
【发布时间】:2013-04-24 10:49:24
【问题描述】:

我想向您寻求帮助,因为我遇到了以下问题。另一件事我一开始要说的是,我是 JSF 开发的新手。

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

现在我正在为新用户制作注册表单。该测试申请由四页组成。第一个包含基本的静态信息,第二页是填写用户主要信息的表格,第三页用户将选择免费期限(这是我的问题!)最后一个将是概要和按钮,用于保存所有填写或选择的内容信息。

第三页:

这是一个带有单选复选框和单选的 PrimeFaces 数据表。我关注了PrimeFaces show caseBalusC's Datatables tutorial。问题 不可能显示来自 db 的填充列表。主要问题是属性 private 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>

我做错了什么?

感谢您的任何回复或建议!

【问题讨论】:

    标签: hibernate jsf-2 primefaces


    【解决方案1】:

    org.hibernate.exception.SQLGrammarException: 错误: 列 collection0_.selectedterm 不存在

    这是你的根本原因。您需要首先解决该映射/数据库错误。那么

    1. 出于最佳实践和可用性的考虑,不要将 JPA 实体和 JSF 托管 Bean 结合起来。这意味着 @ManagedBean@Entity 不应在同一个 POJO 上声明您的 bean 应该是模型或控制器,而不是两者。

    2. 使用@ManagedBean 注释或faces-config.xml 文件,不能同时使用。尽管文件将优先于(我相信)注释,但最终会引起混乱

    【讨论】:

    • 感谢您的帮助。很抱歉迟到的反馈。我将以前的 bean 分成两个分开的,现在更清晰了。但我还有另一个问题。使用带有单选复选框的 PrimeFaces 数据表设置,返回给我这个错误:javax.el.PropertyNotFoundException: Property 'c_id' not found on type java.lang.String 现在,我真的不知道是什么我应该改变。但可能仅从这个错误消息很难说。
    • @PrincAm,您需要发布另一个完整的问题才能获得明确的答案,但我最好的猜测是您遇到了与 JSF 转换相关的问题
    【解决方案2】:

    Entity 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;
    ...
    ..
    
    }
    

    类似上面的东西来匹配你的底层表结构。这应该让您有一个良好的开端。

    【讨论】:

    • 感谢解释和推荐!
    猜你喜欢
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 2014-01-27
    • 2013-10-29
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多