我想将一个用户列表分配给一个项目,然后我的xhtml是这样的:
<p:dataTable id="dta" value="#{UtilisateurComponent.listUtilisateurs()}" var="current" rows="15" paginator="true" paginatorPosition="bottom">
<p:column>
<h:selectManyCheckbox id="selectUser" value="#{ProjetComponent.projet.utilisateurs}" >
<f:selectItem var="utilisateurs" value="#{utilisateurs.iduser}" itemLabel=""/>
<f:converter converterId="entityConverter" />
</h:selectManyCheckbox>
</p:column>
</p:dataTable>
</h:panelGrid>
<h:panelGroup>
<p:commandButton image="save" ajax="false" style="margin-right:20px;" value="#{projetmsgs['navigation.save']}" action="#{ProjetComponent.saveProjetUtilisateurs1(ProjetComponent.projet,ProjetComponent.projet.utilisateurs)}"/>
</h:panelGroup>
</p:panel>
这是保存在ProjetComponent中的方法:
private Projet projet;
private Utilisateur utilisateurs;
@Autowired
private ProjetDAO projetDAO;
@Autowired
private UtilisateurDAO utilisateurDAO;
@Autowired
private ProjetService projetService;
@Transactional
public String saveProjetUtilisateurs1(Projet p, List<Utilisateur> utilisateur) {
projet = projetService.saveProjetUtilisateurs(p, utilisateur);
return "/jsf/projet/viewProjet.xhtml";
}
这个方法保存在由ProjetCompnent组件调用的ProjetService类中:
@Transactional
public Projet saveProjetUtilisateurs(Projet projet,List<Utilisateur> ut)
{
projet.setAvancement(projet.getAvancement());
projet.setConfidentialite(projet.getConfidentialite());
projet.setDatedebut(projet.getDatedebut());
projet.setDatefineffective(projet.getDatefineffective());
projet.setDatefinprevu(projet.getDatefinprevu());
projet.setDescription(projet.getDescription());
projet.setDurreprojet(projet.getDurreprojet());
projet.setNomprojet(projet.getNomprojet());
projet.setObjectifprojet(projet.getObjectifprojet());
projet.setStatut(projet.getStatut());
projet.setUtilisateurs(ut);
projet = projetDAO.store(projet);
projetDAO.flush();
return projet;
}
这是Projet实体:
@Entity
public class Projet implements Serializable {
@Id
private Integer idprojet;
@ManyToMany(mappedBy = "projets", fetch = FetchType.LAZY)
java.util.List<com.gestion.projet.domain.Utilisateur> utilisateurs;
}
screentshot:
问题是获得一个空的用户列表:
答案 0 :(得分:0)
尝试在p:ajax
上使用h:selectManyCheckbox
。
<p:ajax event="change" process="@this" />
如果您希望在Primeface Datatable上基于Checkbox进行多项选择,则无需使用显式h:selectManyCheckbox
。
您可以通过在第一个/最后一个selectionMode="multiple"
上指定p:column
属性来实现此目的。
答案 1 :(得分:0)
这是entityConverter:
@FacesConverter(value = "entityConverter")
public class EntityConverter implements Converter {
private static Map<Object, String> entities = new WeakHashMap<Object, String>();
public String getAsString(FacesContext context, UIComponent component, Object entity) {
synchronized (entities) {
if (!entities.containsKey(entity)) {
String uuid = UUID.randomUUID().toString();
entities.put(entity, uuid);
return uuid;
} else {
return entities.get(entity);
}
}
}
public Object getAsObject(FacesContext context, UIComponent component, String uuid) {
for (Entry<Object, String> entry : entities.entrySet()) {
if (entry.getValue().equals(uuid)) {
return entry.getKey();
}
}
return null;
}
}