映射实体关系和转换实体的策略

时间:2012-05-03 21:43:32

标签: jsf jpa jsf-2 ejb crud

我正在学习java ee 6.我的目标是拥有一个简单的crud应用程序,它允许我创建编辑列表并删除一个简单的id,名称字符串和描述字符串。我按照这个只是为了看到一些代码http://netbeans.org/kb/docs/web/jsf20-crud.html我使用eclipse而不是netbeans和jboss 7而不是玻璃鱼。嗯......它有效。

现在认为我的实体是“用户”:id,username,Password。 我想添加一个“UserRole”实体,这里是:id,rolename。 然后我设置了OneToMany和ManyToOne关系。

那么,如何在创建用户页面中管理角色输入? Netbeans crud建议代码是一个selectonemenu(一个选择下拉列表),其中所有角色ID都是值。在表单上,​​角色控制器(jsf托管bean)中的静态内部类“roleconverter”(facesconverter)获取所选和提交的角色Id字符串,并使用ejb-dao查找相应的角色。

我的问题是:

  • 我明白吗?我上面写的是正确的吗?
  • 以这种方式使用转换器是最好的做法吗?对于这样一个简单而经常性的任务,难道不存在更好的解决方案吗?
  • 实体的转换器除了实体名称之外都是相同的,我如何删除重复,例如使用通用转换器?
  • 您认为在jsf 2中管理多对多的GUI是什么? (例如,具有多个角色的用户方案)

1 个答案:

答案 0 :(得分:0)

这是对的。转换器是必需的,因为HTML基本上是一个大String,HTTP请求参数都是String。 HTML和HTTP不了解也不传递具体的Java对象。它们只存在于webserver的内存中。您确实需要能够在SomeRandomEntityString之间进行转换,以便生成HTML响应并正确解析HTTP请求参数。

对于转换器实际上不是DRY,如果所有实体扩展了一个公共基本实体,其中@Id与getter和setter一起定义,并且你有一个通用的DAO,那么你可以为此创建一个通用的转换器。这样的事情(省略的预检和ConverterException处理省略):

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (value == null) {
        return null;
    }

    Long id = ((BaseEntity) value).getId();
    return String.valueOf(id);
}

@Override
@SuppressWarnings("unchecked")
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    if (value == null) {
        return null;
    }

    Long id = Long.valueOf(value);
    Class<BaseEntity> type = (Class<BaseEntity>) component.getValueExpression("value").getType(context.getELContext());
    return genericDAO.find(id, type);
}

或者,在<h:selectOneMenu>的特定情况下,您还可以使用基于<f:selectItem(s)>的对象值进行转换的转换器。然而,这并非完全无足轻重。 JSF2组件库OmniFaces在其组合中具有这样的SelectItemsConverter。如果感兴趣,您可能需要查看其源代码。