1

我有一个包含 2 个表CDSong. 会话 bean 访问然后是这两个表的实体类。在我的支持 bean 中,我只有一个String cdHashMap<CDName, CDName> cds它将保存从我的 sessionbean 返回的 CD 列表,所以在 JSF 中我会做这样的事情。

<h:selectOneMenu id="cd" value="#{backingBean.cd}">
     <f:selectItem itemLabel="Select CD" itemValue="" />
     <f:selectItems value="#{backingBean.cds}" />
</h:selectOneMenu>

这成功地将 cd 列表加载到下拉列表中,如果我选择 cd,cd变量将保存我选择的 CD 的名称。如果CDName是独一无二的,这项工作就很棒。但不幸的是,事实并非如此。所以我想要的是table 中的 PK 在HashMap<ID, CDName> cds哪里。但是现在我可以如何设置它,所以当我从 CD 下拉列表中单击一个项目时,我会在我的 backingbean 中返回,这样我就可以在我的会话 bean 中执行类似的操作IDCDID

CD cd = EntityManager.find(CD.class, the id that I get back from JSF page)

本质上我想获得cd我刚刚点击的对象,记住它,可能会有重复。如果我的设计不好,请指出。请帮忙。提前致谢

4

1 回答 1

2

#{backingBean.cd}如您的代码示例所示,它将在后面的属性中设置。

所以,基本上:

CD cd = em.find(CD.class, this.cd);

或者,您也可以使用 aHashMap<CD, CDName>代替并使用 a javax.faces.convert.Converter,它基本上执行以下操作:

public Object getAsObject(FacesContext context, UIComponent component, String value) {
    return em.find(CD.class, value);
}

public String getAsString(FacesContext context, UIComponent component, Object value) {
    return String.valueOf(((CD) value).getId());
}

也可以看看:


也就是说, aHashMap本质上是无序的。您确定不需要TreeMap(按键自动排序)或LinkedHashMap(插入顺序)吗?

于 2010-06-25T18:41:08.243 回答