0

我正在使用Primefaces 3.4.1Glassfish 3.1.1Netbeans 7.2

我有一个calendarAdmin.xhtml页面,其中包含一个 primefaces 时间表。单击计划时间段后,它将弹出一个对话框,询问新的事件信息,例如持续时间和事件名称等。

            <h:form id="forminput" prependId="false">
            <p:messages autoUpdate="true"/>
            <p:growl id="growl" showDetail="true" sticky="false"/>
            <p:ajaxStatus>
                <f:facet name="start">
                    <h:graphicImage value="images/loading.gif" />
                </f:facet>
                <f:facet name="complete">
                    <h:outputText value="" />
                </f:facet>
            </p:ajaxStatus>
            <h:panelGrid columns="1" style="width: 100%;">
                <p:selectOneMenu id="som_room" 
                                 value="#{calendarAdmin.selectedroomid}" 
                                 effect="fold"
                                 validator="#{calendarAdmin.validateRoom}"
                                 binding="#{calendarAdmin.somRoom}"
                                 style="width:260px">
                    <p:ajax event="change"                                
                            update="@form"/>
                    <f:selectItem itemLabel="#{bundle.AllRoomsLabel}" itemValue="100"/>
                    <f:selectItems value="#{calendarAdmin.rooms}" />  
                </p:selectOneMenu>
                <p:schedule value="#{calendarAdmin.lazyEventModel}" 
                            widgetVar="myschedule"
                            firstHour="6">
                    <p:ajax event="dateSelect" 
                            listener="#{calendarAdmin.onDateSelect}" 
                            update="newEventDetails" 
                            oncomplete="newEventDialog.show()" />  
                    <p:ajax event="eventSelect" 
                            listener="#{calendarAdmin.onEventSelect}" 
                            update="viewEventDetails" 
                            oncomplete="viewEventDialog.show()" />  
                </p:schedule>                    
            </h:panelGrid>
            <p:dialog widgetVar="newEventDialog" header="#{bundle.AddLabel} #{bundle.EventLabel} #{bundle.NewLabel}?" 
                      showEffect="clip" 
                      hideEffect="clip"
                      modal="true">  
                <h:panelGrid id="newEventDetails" columns="3">  
                    <h:outputText value="#{calendarAdmin.startDate}" 
                                  style="font-style: italic; font-weight: bold;">  
                        <f:convertDateTime type="date" pattern="EEE, dd MMM, yyyy HH:mm"/>                         
                    </h:outputText>
                    <h:outputText value="#{bundle.UntilLabel}" style="font-weight: bold;"/>
                    <h:outputText id="endtime" value="#{calendarAdmin.endDate}" 
                                  style="font-style: italic; font-weight: bold;">
                        <f:convertDateTime type="date" pattern="EEE, dd MMM, yyyy HH:mm"/> 
                    </h:outputText>
                    <h:outputText value=""/>
                    <h:outputText value=""/>
                    <h:outputText value=""/>
                    <h:outputText value="#{bundle.NameLabel} #{bundle.RoomLabel}"/>
                    <h:outputText value=""/>
                    <p:selectOneMenu id="som_roomnewevent" 
                                     value="#{calendarAdmin.neweventroomid}" 
                                     effect="fold"
                                     validator="#{calendarAdmin.validateRoom}"
                                     binding="#{calendarAdmin.somRoomNewEvent}"
                                     style="width:200px;">
                        <f:selectItems value="#{calendarAdmin.rooms}" />  
                    </p:selectOneMenu>
                    <h:outputText value="#{bundle.NameLabel} #{bundle.EventLabel}"/>
                    <h:outputText value=""/>
                    <p:inputText value="#{calendarAdmin.neweventname}" 
                                 required="true"
                                 size="22"/>
                    <h:outputText value="#{bundle.DurationLabel} (#{bundle.MinuteLabel})"/>
                    <h:outputText value=""/>
                    <p:selectOneMenu id="som_newduration"
                                     value="#{calendarAdmin.neweventduration}"
                                     binding="#{calendarAdmin.somNewDuration}"
                                     style="width:200px;">
                        <p:ajax update="forminput:endtime" 
                                event="change" 
                                listener="#{calendarAdmin.addTime}"/>
                        <f:selectItem itemLabel="30 Minit" itemValue="30"/>
                        <f:selectItem itemLabel="1 Jam" itemValue="60"/>
                        <f:selectItem itemLabel="1 Jam 30 Minit" itemValue="90"/>
                        <f:selectItem itemLabel="2 Jam" itemValue="120"/>
                        <f:selectItem itemLabel="2 Jam 30 Minit" itemValue="150"/>
                        <f:selectItem itemLabel="3 Jam" itemValue="180"/>
                        <f:selectItem itemLabel="3 Jam 30 Minit" itemValue="210"/>
                        <f:selectItem itemLabel="4 Jam" itemValue="240"/>
                        <f:selectItem itemLabel="4 Jam 30 Minit" itemValue="270"/>
                        <f:selectItem itemLabel="5 Jam" itemValue="300"/>
                        <f:selectItem itemLabel="5 Jam 30 Minit" itemValue="330"/>
                        <f:selectItem itemLabel="6 Jam" itemValue="360"/>
                        <f:selectItem itemLabel="6 Jam 30 Minit" itemValue="390"/>
                        <f:selectItem itemLabel="7 Jam" itemValue="420"/>
                        <f:selectItem itemLabel="7 Jam 30 Minit" itemValue="450"/>
                        <f:selectItem itemLabel="8 Jam" itemValue="480"/>
                        <f:selectItem itemLabel="8 Jam 30 Minit" itemValue="510"/>
                        <f:selectItem itemLabel="9 Jam" itemValue="540"/>
                        <f:selectItem itemLabel="9 Jam 30 Minit" itemValue="570"/>
                        <f:selectItem itemLabel="10 Jam" itemValue="600"/>
                        <f:selectItem itemLabel="10 Jam 30 Minit" itemValue="630"/>
                    </p:selectOneMenu>
                    <h:panelGroup>
                        <p:commandButton value="#{bundle.OnLabel}" 
                                         action="#{calendarAdmin.addEventEx}"
                                         oncomplete="myschedule.update(); newEventDialog.hide();"
                                         update="growl"/>  
                        <p:commandButton value="#{bundle.OffLabel}" 
                                         oncomplete="myschedule.update(); newEventDialog.hide();"/>  
                    </h:panelGroup>
                </h:panelGrid>  
            </p:dialog>                  

我正在使用LazyScheduleModel使用数据库中的事件填充时间表;这是来自支持 bean calendarAdmin ViewScoped bean 的我的 PostConstruct。

    @PostConstruct
public void init() {
    try {
        LogController.log.info("Initializing viewRoomBookingSchedule bean");
        fc = FacesContext.getCurrentInstance();
        bundle = fc.getApplication().getResourceBundle(fc, "bundle");
        LogController.log.info("Loading room names for the select one box");
        wfrooms = wfRoomFacade.selectAll();
        LogController.log.info("Putting all other room labels into the select one box");
        for (WfRoom wfr : wfrooms) {
            rooms.put(wfr.getWfRoomName(), wfr.getIdWfRoom());
        }
        LogController.log.info("Initialize selected room id to all rooms with value 100");
        selectedroomid = 100;
        lazyEventModel = new LazyScheduleModel() {
            @Override
            public void loadEvents(Date start, Date end) {
                LogController.log.info("Loading events for room " + selectedroomid + " starting from " + start.toString() + " until " + end.toString());
                List<WfRoombookingschedule> wfroombookingschedules = loadSchedules(start, end);
                if (wfroombookingschedules != null) {
                    for (WfRoombookingschedule wfrbs : wfroombookingschedules) {
                        Date combinedDateAndTime = workflowUtil.getDateTime(wfrbs.getWfRoombookingscheduleDate(), wfrbs.getWfRoombookingscheduleTime());
                        Date eventEndDate = workflowUtil.addMinutes(combinedDateAndTime, wfrbs.getWfRoombookingscheduleDuration());
                        String styleClass;
                        if (wfrbs.getIdWfRoombooking().getIdWfRoom().getIdWfRoom() == applicationConfig.getRoomEdit1()) {
                            styleClass = "edit1";
                        } else if (wfrbs.getIdWfRoombooking().getIdWfRoom().getIdWfRoom() == applicationConfig.getRoomEdit2()) {
                            styleClass = "edit2";
                        } else if (wfrbs.getIdWfRoombooking().getIdWfRoom().getIdWfRoom() == applicationConfig.getRoomSuaraMalaysia()) {
                            styleClass = "suaramalaysia";
                        } else if (wfrbs.getIdWfRoombooking().getIdWfRoom().getIdWfRoom() == applicationConfig.getRoomStudioMusic()) {
                            styleClass = "studiomusic";
                        } else if (wfrbs.getIdWfRoombooking().getIdWfRoom().getIdWfRoom() == applicationConfig.getRoomTalkMusic()) {
                            styleClass = "talkmusic";
                        } else {
                            styleClass = "defaultroom";
                        }
                        if (wfrbs.getIdWfRoombooking().getIdWfEventtype().getIdWfEventtype() != 2) {
                            addEvent(new DefaultScheduleEvent(wfrbs.getIdWfRoombooking().getIdWfSpecialevent().getWfSpecialeventName(), combinedDateAndTime, eventEndDate, styleClass));
                        } else {
                            addEvent(new DefaultScheduleEvent(wfrbs.getIdWfRoombooking().getIdWfStudiobooking().getWfStudiobookingTitle(), combinedDateAndTime, eventEndDate, styleClass));
                        }
                    }
                }
            }
        };
    } catch (Exception ex) {
        LogController.log.fatal(ex.toString());
    }
}

如果用户单击新事件对话框上的“是”按钮,托管 bean 会将他重定向到createEventBooking.xhtml,他将能够在其中修改/确认新事件详细信息,并且他可以单击保存按钮将新事件保存到数据库中。成功持久化到数据库后,支持 bean createEventBooking bean 会将用户重定向回calendarAdmin.xhtml,如下所示:

    public String saveEvent() {
    try { 
    ......
    **return "/calendarAdmin?faces-redirect=true";**

这就是问题发生的时候,它可以回到calendarAdmin.xhtml,但日程是空的,我放在calendarAdmin.xhtml顶部的那个小 ajax 状态 gif 文件一直在无限期地旋转。如果我从 Netbeans 运行按钮中重新运行应用程序,并尝试打开calendarAdmin.xhtml,同样的事情会再次发生。那个 ajax 状态图标无限期地旋转。我尝试用 F5 刷新页面,但仍然是同样的问题。

从 MySQL Workbench 检查时,我看到新事件已成功创建,没有任何问题。但是为什么带有primefaces schedule的页面无法加载包括新创建的事件在内的事件?

我做了进一步的测试,我重新启动了 glassfish 3.1.1 服务器,停止并启动服务器 glassfish,重新运行应用程序,重新打开calendarAdmin.xhtml,然后页面正确打开,包括新创建的事件在内的事件正确加载。

4

1 回答 1

0

我刚得到答案。这更像是一个父子实体 jpa 关系问题。无论如何,这是我的 ejb 外观对象中的数据库保存代码(之前)。

   @TransactionAttribute(TransactionAttributeType.REQUIRED)
   public int addEvent(WfRoombooking wfroombooking, List<WfRoombookingschedule> wfroombookingschedules, WfSpecialevent wfspecialevent) {
    try {
        int res = 0;
        LogController.log.debug("Beginning transaction");
        LogController.log.debug("Create the wf room booking object");
        create(wfroombooking);
        LogController.log.debug("Refreshing the entity manager to get the new room booking id");
        getEntityManager().flush();
        LogController.log.debug("New booking id " + wfroombooking.getIdWfRoombooking());
        //ROOM BOOKING SCHEDULE PERSISTENCE
        if (wfroombookingschedules.size() > 0) {
            LogController.log.debug("Saving the room booking schedules for this room booking");
            LogController.log.debug("Assigning room booking with id " + wfroombooking.getIdWfRoombooking() + " to all the room booking schedule objects");
            for (WfRoombookingschedule wfrbs : wfroombookingschedules) {
                LogController.log.debug("Assigning room booking id for start date " + wfrbs.getWfRoombookingscheduleDate().toString() + " with duration " + wfrbs.getWfRoombookingscheduleDuration().toString());
                wfrbs.setIdWfRoombooking(wfroombooking);
            }
            LogController.log.debug("Calling room booking schedule facade to persist the room booking schedules");
            res = wfRoombookingscheduleFacade.addRoombookingschedules(wfroombookingschedules);
            if (res == 0) {
                LogController.log.debug("Room booking schedules information successfully persisted");
            } else {
                LogController.log.error("Error in persisting room booking schedules information");
            }
        } else {
            res = 0;
            LogController.log.debug("Room booking schedule not defined for this room booking");
        }
        //SPECIAL EVENT PERSISTENCE
        LogController.log.debug("Saving the special event object for this room booking");
        LogController.log.debug("Assigning room booking with id " + wfroombooking.getIdWfRoombooking() + " to the special event object");
        wfspecialevent.setIdWfRoombooking(wfroombooking);
        LogController.log.debug("Persisting the special event object");
        wfSpecialeventFacade.addSpecialEvent(wfspecialevent);
        LogController.log.debug("Ending transaction");
        return res;
    } catch (Exception ex) {
        context.setRollbackOnly();
        LogController.log.fatal(ex.toString());
        return -1;
    }
}

这是之后的代码,请注意 WfRoombookingschedule 和 WfSpecialevent 都是 WfRoombooking 的子实体。然后我像这样添加了从父母到孩子的关联;

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
public int addEvent(WfRoombooking wfroombooking, List<WfRoombookingschedule> wfroombookingschedules, WfSpecialevent wfspecialevent) {
    try {
        int res = 0;
        LogController.log.debug("Beginning transaction");
        LogController.log.debug("Create the wf room booking object");
        create(wfroombooking);
        LogController.log.debug("Refreshing the entity manager to get the new room booking id");
        getEntityManager().flush();
        LogController.log.debug("New booking id " + wfroombooking.getIdWfRoombooking());
        //ROOM BOOKING SCHEDULE PERSISTENCE
        if (wfroombookingschedules.size() > 0) {
            LogController.log.debug("Saving the room booking schedules for this room booking");
            LogController.log.debug("Assigning room booking with id " + wfroombooking.getIdWfRoombooking() + " to all the room booking schedule objects");
            for (WfRoombookingschedule wfrbs : wfroombookingschedules) {
                LogController.log.debug("Assigning room booking id for start date " + wfrbs.getWfRoombookingscheduleDate().toString() + " with duration " + wfrbs.getWfRoombookingscheduleDuration().toString());
                wfrbs.setIdWfRoombooking(wfroombooking);

                ***LogController.log.debug("Setting room booking schedules into room booking");
                wfroombooking.setWfRoombookingscheduleCollection(wfroombookingschedules);***

            }
            LogController.log.debug("Calling room booking schedule facade to persist the room booking schedules");
            res = wfRoombookingscheduleFacade.addRoombookingschedules(wfroombookingschedules);
            if (res == 0) {
                LogController.log.debug("Room booking schedules information successfully persisted");
            } else {
                LogController.log.error("Error in persisting room booking schedules information");
            }
        } else {
            res = 0;
            LogController.log.debug("Room booking schedule not defined for this room booking");
        }
        //SPECIAL EVENT PERSISTENCE
        LogController.log.debug("Saving the special event object for this room booking");
        LogController.log.debug("Assigning room booking with id " + wfroombooking.getIdWfRoombooking() + " to the special event object");
        wfspecialevent.setIdWfRoombooking(wfroombooking);

        ***LogController.log.debug("Setting room special event into room booking");
        wfroombooking.setIdWfSpecialevent(wfspecialevent);***

        LogController.log.debug("Persisting the special event object");
        wfSpecialeventFacade.addSpecialEvent(wfspecialevent);
        LogController.log.debug("Ending transaction");
        return res;
    } catch (Exception ex) {
        context.setRollbackOnly();
        LogController.log.fatal(ex.toString());
        return -1;
    }
}

如果回答我自己的问题不合适,我向模组道歉,但我只是觉得有必要分享,以便像我这样的其他人可以受益。TQ。

于 2012-11-19T12:32:37.050 回答