JSF / PrimeFaces使用selectOneMenu将列表中的项目关联起来
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSF / PrimeFaces使用selectOneMenu将列表中的项目关联起来相关的知识,希望对你有一定的参考价值。
在JSF应用程序中,我有一个包含3000个活动的列表(JPA实体活动)。最终用户需要将这些活动关联在称为作业的组中(JPA实体作业)。多个用户可以声明某项活动。
我正在尝试在数据表列表上使用p:selectOneMenu
,以使登录用户能够将活动标记到其JobId。
如果琼斯已登录,则第一个活动的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