JSF / PrimeFaces使用selectOneMenu将列表中的项目关联起来

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSF / PrimeFaces使用selectOneMenu将列表中的项目关联起来相关的知识,希望对你有一定的参考价值。

在JSF应用程序中,我有一个包含3000个活动的列表(JPA实体活动)。最终用户需要将这些活动关联在称为作业的组中(JPA实体作业)。多个用户可以声明某项活动。

我正在尝试在数据表列表上使用p:selectOneMenu,以使登录用户能够将活动标记到其JobId。

enter image description here

如果琼斯已登录,则第一个活动的Tag Your Job列中的选择菜单将设置为205。如果Smith登录了select并且他们在Tag Your Job列中选择了426(菜单将只列出Smith的作业ID),那么它将被添加到Associated Jobs列的列表中。

我不知道如何连线。这是我的xhtml和实体。

<p:dataTable id="dataTable" var="activity" 
    selection="#{activityAssociator.activitiesToAssociate}" rowKey="#{activity.an}" 
    value="#{activityAssociator.listOfActiveArtemisActivities}" filteredValue="#{activityAssociator.filteredActivities}">

<p:column headerText="Tag Your Job">
   <p:selectOneMenu value="#{activityAssociator.selectedJob}" converter="omnifaces.SelectItemsConverter" valueChangeListener="#{activityAssociator.listenTest1}">
    <f:selectItem itemLabel="Select One" itemValue="#{null}" noSelectionOption="true" />
    <f:selectItems value="#{activityAssociator.myAvailableJobs}" var="job" itemValue="job" itemLabel="#{job.jobId}" />
<p:ajax update="@form" listener="#{activityAssociator.listenTest2}" />
</p:selectOneMenu>

活动实体

@ManyToMany(mappedBy = "artemisActivities")
private Collection<SupervisorJob> supervisorJobs;

工作实体

@ManyToMany
@JoinTable(name = "CTC_JOB_ACTIVITES", joinColumns = @JoinColumn(name = "jobId"), inverseJoinColumns = @JoinColumn(name = "an"))
private Collection<ArtemisActivity> artemisActivities;

编辑

根据BalusC在下面的评论,我在活动实体中添加了:

@Transient
private SupervisorJob myJob;
typical getter/setter

和我的支持bean中的这个方法,它是从@PostConstruct方法调用的

private void setSupervisorJob() {
    for (ArtemisActivity act : listOfActiveArtemisActivities) {
        for (SupervisorJob sj : act.getSupervisorJobs()) {
            if (sj.getJobOwner().equals(auth.getEmployee())) {
                act.setMyJob(sj);
            }
        }
    }
}

我还修改了<p:selectOneMenu并更改为value="#{activity.myJob}"数据表列表的初始显示现在显示每个selectonemenu正确填充(如果适用)。这很好。

但是当我对行的选择菜单之一进行更改时,如何引用活动ID?我正在尝试每次仅在该活动上更改作业selectonemenu时进行JPA更新/合并。或者我应该每次都对整个3000实体集合进行JPA更新/合并。这似乎有点矫枉过正。实际上,当我在监听器事件期间在我的辅助bean中迭代它时,数据表值listOfActiveArtemisActivities甚至不会根据下拉中的选择反映更改。

答案

我只是错过了我试图联想的听众中两个实体的传递。 listener="#{bean.selectListener(activity, activity.myJob)}" />

除了Transient字段上面列出的编辑,myJob这里是选择一个菜单

<p:dataTable id="dt1" var="activity"  value="#{bean.list}" >
    <p:column headerText="Select">
        <p:selectOneMenu value="#{activity.myJob}" converter="omnifaces.SelectItemsConverter">
            <f:selectItem itemLabel="Select One" itemValue="#{null}" noSelectionOption="true" />
            <f:selectItems value="#{bean.selectItems}" var="job" itemValue="#{job}" itemLabel="#{job.jobId} - #{job.job_short_name} " />
            <p:ajax update="@form" listener="#{bean.selectListener(activity, activity.myJob)}" />
        </p:selectOneMenu>
   </p:column>

以上是关于JSF / PrimeFaces使用selectOneMenu将列表中的项目关联起来的主要内容,如果未能解决你的问题,请参考以下文章

在 JSF 中使用 Primefaces 和 Bootstrap

使用 JSF 2.0 和 Primefaces 设置项目

使用ajax从jsf中的primefaces树选定项设置primefaces selectOneMenu默认值

JSF 2.0 无法从 primefaces 呈现对话框

如何使用 PrimeFaces 在 JSF 上重定向?

从支持 Bean 刷新 JSF/PrimeFaces 接口