代码之家  ›  专栏  ›  技术社区  ›  Letholdrus

Primefaces datatable用于显示不可更新的数据库视图结果?

  •  0
  • Letholdrus  · 技术社区  · 7 年前

    很好的一天

    是否有可能(我似乎被困在无法单击“勾选”接受行编辑)使用Primefaces数据表来显示不可更新Postgres视图的结果,但在onRowEdit事件中有自定义代码,可以将更改正确保存到DB中?

    或者必须将Primefaces/JSF数据表链接到可更新的实体映射,以便使用它来“更新”和显示信息?

    我已经在了。xhtml文件:

     <p:dataTable id="conf_data_table" var="confRoomBookingDisplay" style="width: auto" rowIndexVar="rowid" editingRow="true"
                                 value="#{conferenceRoomBookingView.conferenceRoomBookingList}" editable="true"
                                 editMode="row" widgetVar="cellBookings">
                        <f:facet name="header">
                            Venue Booking
                        </f:facet>
    
                        <p:ajax event="rowEdit" listener="#{conferenceRoomBookingView.onRowEdit}"
                                update=":create_new_booking:growl"/>
                        <p:ajax event="rowEditCancel" listener="#{conferenceRoomBookingView.onRowCancel}"
                                update=":create_new_booking:growl"/>
    
                        <p:column headerText="Booking Ref" style="width: 10%; text-align: center">
                            <p:outputLabel value="#{ConferenceRoomBooking.conferenceRoomBookingAid}"
                                           style="text-align: center"/>
                        </p:column>
    
                        <p:column headerText="Time Slot" style="width: 10%; text-align: center">
                            <p:outputLabel value="#{ConferenceRoomBooking.timeSlot}" style="text-align: center"/>
                        </p:column>
    
                        <p:column headerText="Booked For" style="width: 15%; alignment: center">
                            <p:outputLabel value="#{ConferenceRoomBooking.empShortNameSurname}"
                                           style="text-align: left"/>
                        </p:column>
    
    
                        <p:column headerText="Booking Comment" style="width: 60%; alignment: center">
                            <p:cellEditor>
                                <f:facet name="output">
                                    <h:outputText value="#{ConferenceRoomBooking.conferenceRoomBookingComment}"/>
                                </f:facet>
                                <f:facet name="input">
                                    <p:inputText value="#{ConferenceRoomBooking.conferenceRoomBookingComment}"
                                                 style="width:98%"/>
                                </f:facet>
                            </p:cellEditor>
                        </p:column>
    
                        <p:column style="width: 5%">
                            <p:rowEditor />
                        </p:column>
    
                    </p:dataTable>
    

    然后在我的@RequestScoped(javax.enterprise.context.RequestScoped)上,命名为backing bean(我也使用了@ViewScoped-org.omnifaces.cdi注释)。

    事件代码如下所示:

    public void onRowEdit(RowEditEvent event) {
        conferenceRoomBookingAid = (((ConferenceRoomBookingEntity) event.getObject()).getConferenceRoomBookingAid());
        String msgEdit = Long.toString(conferenceRoomBookingAid);
        FacesMessage msg = new FacesMessage("Booking Edited for Reference ID:", msgEdit);
        FacesContext.getCurrentInstance().addMessage(null, msg);
        confRoomService.persistComment(How do I get my updated value from the event???);
    }
    
    public void onRowCancel(RowEditEvent event) {
        conferenceRoomBookingAid = (((ConferenceRoomBookingEntity) event.getObject()).getConferenceRoomBookingAid());
        String msgEdit = Long.toString(conferenceRoomBookingAid);
        FacesMessage msg = new FacesMessage("Booking Cancelled for Reference ID: ", msgEdit);
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
    

    当前正在注释出 confRoomService.persistComment(How do I get my updated value from the event???); 代码,使我进入一个正确呈现的表,在那里我可以编辑该行。但问题是,我无法用鼠标单击“接受”/“是”勾选,按enter键只会再次清除单元格。

    我使用不可更新视图的原因是,当前DB结构使用外键将数据链接到个人,并且使用基本实体将显示外键id而不是其值。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Letholdrus    7 年前

    在经历了大量不同版本的实体和数据库视图之后,我得出结论,JSF/Primefaces datatable组件将被使用:

    1. 当通过可变实体直接链接时,即底层数据库表的100%表示形式,并且没有数据的自定义视图,则允许进行完全编辑,并按公告的方式工作。
    2. 当链接到基于数据库视图(是否可更新)的实体时,无法在datatable cellEdit或rowEdit事件中编辑datatable的单元格/行。

    如果在上述问题上被证明是错误的,我会欣喜若狂,但现在我已经平静地使用datatable作为基于数据库视图的不可变数据表。