在JSF应用程序中,我有一个包含3000个活动的列表(JPA实体活动)。最终用户需要将这些活动关联在称为作业的组中(JPA实体作业)。多个用户可以声明某项活动。
我正在尝试在数据表列表中使用p:selectOneMenu
,以使登录用户能够将活动标记到其JobId。
如果琼斯已登录,则第一项活动的Tag Your Job
列中的选择菜单将设置为205。如果史密斯登录了选择并且他们在Tag Your Job
列中选择了426(菜单将仅列出史密斯的工作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
甚至不会根据下拉中的选择反映更改。