【问题标题】:Scaffolding ManyToMany associations with Netbeans and JSF与 Netbeans 和 JSF 建立多对多关联
【发布时间】:2011-06-15 12:17:44
【问题描述】:

我正在使用 NetBeans 及其 RAD 开发功能开发 JEE6 JSF 应用程序。我想使用脚手架来节省从模型更新控制器和视图的时间。在视图中生成 OneToMany 关联没有任何问题(作为让您选择父实体的下拉菜单),但不会生成 ManyToMany 关联。

您知道一种搭建多对多关联的方法吗?您对 NetBeans 使用了哪些 RAD 技术? (你推荐的插件、教程、材料)

【问题讨论】:

    标签: java jsf netbeans rad scaffolding


    【解决方案1】:

    实际上,无论数据库供应商是什么,使用 Netbeans 的 JSF 脚手架还不能管理 Many2Many 关系。数据库视图也是如此。

    如您所见,当您想从数据库生成实体时,仅接受具有 ID(主键)的表。然而,向导将识别连接表并正确注释实体。貌似(Netbeans 7.0) 示例:

    @JoinTable(name = "TOPIC_WRITER", joinColumns = {
            @JoinColumn(name = "topicname", referencedColumnName = "topicname")}, inverseJoinColumns = {
            @JoinColumn(name = "writerid", referencedColumnName = "writerid")})
        @ManyToMany
        private List<Writer> writerList;
    
    @ManyToMany(mappedBy = "writerList")
        private List<Topic> topicList;
    

    通过此链接:http://wiki.netbeans.org/JsfCrudGenerator 您应该注意到,如果需要,您必须修改在生成 JSF 页面(托管 Bean 和 JPA 控制器)之前生成的实体类(如果它们与上面的示例不同)。

    由于 EclipseLink 是 Netbeans 使用的默认 JPA 提供程序,您应该查看 EclipseLink 站点以查看有关如何在实体类中定义多对多关系的示例,并查看如何在 JPA 控制器中管理它 (Java-ee-5)或您生成的无状态会话 bean (Java-EE-6)。

    视图部分的逻辑方法是在创建表单中添加例如:

    <h:selectManyMenu id="writer" value="#{topicController.selected.writerCollection}" title="#{bundle.CreateBookTitle_writer}" required="true" requiredMessage="Writer needed">
                            <f:selectItems value="#{writerController.itemsAvailableSelectMany}"/>
                        </h:selectManyMenu>
    

    但不幸的是,这不起作用并会返回:无效值。虽然这似乎是合乎逻辑的:将 Writer 对象的集合添加到 Topic 对象。

    如您所见,Many2Many 关系由实体类中的集合表示,因此这里的处理是如何将集合添加到对象

    我从未在 JSF 环境中处理过“多对多”关系,所以我现在不知道如何有效地进行这些修改。但是您可以直接询问 Netbeans.org 的 JSF 团队。或者看看SpringFuse的人是如何使用Spring解决这个问题的(其实他们在m2m关系所涉及的实体类中添加了addObject(){}removeObject(){}方法。

    /**
         * Returns the roles List.
         */
        @Cache(usage = NONSTRICT_READ_WRITE)
        @JoinTable(name = "ACCOUNT_ROLE", joinColumns = @JoinColumn(name = "ACCOUNT_ID"), inverseJoinColumns = @JoinColumn(name = "role_id"))
        @ManyToMany(cascade = PERSIST)
        public List<Role> getRoles() {
            return roles;
        }
    
        /**
         * Set the roles List.
         * It is recommended to use the helper method addRole /  removeRole
         * if you want to preserve referential integrity at the object level.
         *
         * @param roles the List of Role
         */
        public void setRoles(List<Role> roles) {
            this.roles = roles;
        }
    
        /**
         * Helper method to add the passed role to the roles List.
         */
        public boolean addRole(Role role) {
            return getRoles().add(role);
        }
    
        /**
         * Helper method to remove the passed role from the roles List.
         */
        public boolean removeRole(Role role) {
            return getRoles().remove(role);
        }
    
        /**
         * Helper method to determine if the passed role is present in the roles List.
         */
        public boolean containsRole(Role role) {
            return getRoles() != null && getRoles().contains(role);
        }
    

    如果您不介意在您的应用程序中使用 Spring Framework,您可以尝试他们的在线 JSF Web 应用程序生成器并检查生成的代码以查看他们和您的代码之间的区别。

    但是,您可以查看这篇博客文章(教程),该文章通过一个简单的示例(书籍 - AuthorBook - Author)解释了在 Netbeans (Java-EE-6) 中支持 Many2Many 关系的方法。 http://ikennaokpala.wordpress.com/2010/06/18/persisting-jpa-many-to-many-relationship/

    【讨论】:

    • 脚手架不是由 Spring 自己完成的,而是由 SpringFuse 在线服务完成的:springfuse.com/ 您可以上传自己的数据库 SQL 并生成一个完整的工作项目,该项目使用:JSF 2.0 / JPA 2 / Spring Web Flow /当然使用Maven(所以首先在你的机器上安装MAVEN)。项目生成后,您可以将其导入 ECLIPSE 并根据需要进行修改。
    【解决方案2】:

    您可以尝试在 Netbeans 7.0 中使用 JSP 作为视图技术而不是 Facelets (XHTML)。如果这样做,IDE 将为 Managed Beans 生成不同的代码,并添加一个实用程序类:JsfElResolver.java,它将在每个用户操作上调用,以允许在父子节点之间导航,就像提交表单一样。 在这种情况下,部分支持 Many2Many 关系,但如果您的数据库设计良好,它通常可以工作。

    正如你所说的插件,在这种情况下,使用 PrimeFacesOpenFaces 作为 A view faces libray。这两个库不需要痛苦的配置,并且可以与 Netbeans 中的 JSF CRUD 脚手架完美配合。除了 Primefaces Datatable 过滤和排序,在使用 DataModel 时存在问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多