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

问题描述 投票:1回答:1

在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甚至不会根据下拉中的选择反映更改。

jsf
1个回答
0
投票

我只是错过了我试图联想的听众中两个实体的传递。 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>
© www.soinside.com 2019 - 2024. All rights reserved.