【问题标题】:Adding entities to a <Collection> in JSF using selectonemenu and/or selectmanymenu使用 selectonemenu 和/或 selectmanymenu 将实体添加到 JSF 中的 <Collection>
【发布时间】:2013-10-11 16:24:42
【问题描述】:

晚上!

我有一个数据库结构,其中包含一个连接表(用户组),该表将用户实体与组实体相关联以进行授权。这是一个多对多的关系(用户是所有者)。遵循 BalusC 在其他帖子中提供的提示和技巧,我正在使用 Omnifaces 框架提供的 SelectItemsConverter 自定义转换器,它允许我使用 Group 实体正确填充下拉列表,但我无法找出正确的语法然后将这些添加到用户实体持有的组中。就目前情况而言,代码将尝试将 Groups 实体转换为带有终端结果的实体!做了一些挖掘后,我想知道是否需要以某种方式将引用绑定到视图,然后在提交表单时将引用传递给 Groups add 方法,但这似乎有点笨拙,我找不到任何东西这证实了我的理论。有人指点吗?

用户实体:

@Entity
@Table(name = "Users")
@XmlRootElement
...
public class Users implements Serializable {
...
    @JoinTable(name = "User_Groups", joinColumns = {
        @JoinColumn(name = "User_ID", referencedColumnName = "User_ID")}, inverseJoinColumns = {
        @JoinColumn(name = "Group_ID", referencedColumnName = "Group_ID")})
    @ManyToMany
    private Collection<Groups> groupsCollection;
 ...

组实体:

@Entity
@Table(name = "Groups")
...
public class Groups implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "Group_ID")
    private Integer groupID;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 20)
    @Column(name = "Group_Name")
    private String groupName;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 200)
    @Column(name = "Group_Desc")
    private String groupDesc;
    @ManyToMany(mappedBy = "groupsCollection")
    private Collection<Users> usersCollection;
...

来自创建用户 JSF 页面的代码片段:

...
<h:outputLabel value="#{bundle.CreateUsersLabel_groups}" for="groupsCollection" />
<h:selectOneMenu id="groupsCollection" value="#{usersController.selected.groupsCollection}" title="#{bundle.CreateUsersTitle_groups}" converter="omnifaces.SelectItemsConverter">
  <f:selectItems value="#{groupsController.itemsAvailableSelectOne}" />
</h:selectOneMenu>
...

【问题讨论】:

  • 您没有正确使用h:selectOneMenu。该组件返回单个选择,而不是您假装的集合 (#{usersController.selected.groupsCollection})。
  • 公平点。我显然做错了什么,但我改用什么?我需要用一个(或多个)组实体填充用户字段中的集合属性。 SelectOneMenu(或替代项)需要填充这些实体,而不是 Collection。

标签: entity-framework jsf jakarta-ee el omnifaces


【解决方案1】:

我认为您需要的是 h:selectManyCheckbox、h:selectManyListbox 或 h:selectManyMenu,任何允许您同时选择多个组以将它们与您的用户相关联的东西。试试这个:

<h:outputLabel value="#{bundle.CreateUsersLabel_groups}" for="groupsCollection" />
   <h:selectManyMenu id="groupsCollection" 
        value="#{usersController.selected.groupsCollection}" 
        title="#{bundle.CreateUsersTitle_groups}" converter="omnifaces.SelectItemsConverter">
   <f:selectItems value="#{groupsController.itemsAvailableSelectOne}" />
</h:selectManyMenu>

【讨论】:

  • 宾果游戏!有用。与迄今为止我在 JSF 中遇到的许多问题一样,解决方案非常简单!但是,有没有办法只允许用户选择一个组?碰巧的是,这个实现目前运行良好,但我希望这种灵活性用于未来的开发。再次感谢 :-) 我的头发现在有机会长回来了……
  • 如果您想允许用户选择单个组,那么您应该使用 h:selectOneMenu。但是,与您所做的相反,selectOneMenu 的“值”属性必须指向一个实体,而不是一个集合。类似于
  • 优秀。感谢您的澄清 - 我会试一试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
相关资源
最近更新 更多