2013-04-30 3 views
1

. 내가 처음에 말해야 할 또 하나의 점은 JSF 개발 과정에서 꽤 새로운 점이라는 것입니다.PrimeFaces DataTable에 목록 표시 및 선택

내가 JSF, PrimeFaces, 최대 절전 모드 및 PostgreSQL을 사용하고 있습니다.

지금 나는 새로운 사용자 등록 양식에 일하고 있습니다. 이 테스트 응용 프로그램은 네 페이지로 구성됩니다. 첫 번째 페이지에는 기본 정적 정보가 들어 있으며, 두 번째 페이지에는 사용자에 대한 주요 정보를 채우는 양식이며, 세 번째 페이지 사용자는 무료 용어를 선택합니다 (여기에 내 문제가 있습니다!). 마지막으로 채우기 또는 choosed 정보.

세 번째 페이지 : 여기

라디오 체크 박스와 하나의 선택과 DataTable을 PrimeFaces이다. 나는 PrimeFaces show caseBalusC's Datatables tutorial을 따랐다. 문제는 db의 채워지지 않은 목록과 함께 표시됩니다. 주요 문제는 속성이있는 개인 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) 

관리 콩 :

@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

이것이 원인입니다. 먼저 매핑/DB 오류를 해결해야합니다. 그런 다음

  1. 모범 사례 및 유용성의 문제로 JPA 엔티티와 JSF Managed Bean을 결합하지 마십시오. 이는 @ManagedBean@Entity이 같은 POJO에서 선언되어서는 안됨을 의미합니다. Bean은 모델 또는 컨트롤러 중 하나 여야하며 둘 다가 아니어야합니다.

  2. @ManagedBean 주석 또는 faces-config.xml 파일 중 하나만 사용하십시오. 둘 다 사용할 수는 없습니다. 파일이 주석을 통해 (내가 믿는) 우선합니다하지만, 결국 혼란

+0

도움 주셔서 감사합니다. 늦은 피드백에 대해 사과드립니다.나는 이전의 콩을 두 개의 분리 된 것으로 나누었으며, 이제 훨씬 더 명확 해졌습니다. 하지만 또 다른 문제가 있습니다. 라디오 확인란을 사용하여 PrimeFaces 데이터 테이블을 설정하면이 오류를 반환합니다. javax.el.PropertyNotFoundException : ** java.lang.String 유형에서 'c_id'속성을 찾을 수 없습니다. ** 이제 정말로 무엇을 변경해야하는지 모르겠습니다. . 그러나 아마도이 오류 메시지에서만 말할 수 있습니다. – PrincAm

+0

@PrincAm, 확실한 답을 얻기 위해 전체 질문을 다시 게시해야하지만 가장 좋은 추측은 JSF 변환 관련 문제가 있다는 것입니다. – kolossus

0

엔티티 빈은 테이블의 단순한 반영해야 발생할 수 있습니다. 각 열은 열 이름에 매핑되어야합니다. Entity 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

관련 문제