java - 使用 Netbeans 和 JSF 搭建 ManyToMany 关联

标签 java jsf netbeans rad scaffolding

我正在使用 NetBeans 及其 RAD 开发功能开发 JEE6 JSF 应用程序。我想使用脚手架来节省更新 Controller 和模型 View 的时间。 OneToMany 关联在 View 中生成没有任何问题(作为让您选择父实体的下拉列表)但 ManyToMany 关联未生成。

您知道建立多对多关联的方法吗?您将哪些 RAD 技术用于 NetBeans? (您推荐的插件、教程、资料)

最佳答案

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

如您所见,当您要从数据库生成实体时,只会接受具有 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 Controller )之前修改生成的实体类,如果它们与上面的示例不同。

由于 EclipseLink 是 Netbeans 使用的默认 JPA profider,您应该查看 EclipseLink 站点以查看有关如何在实体类中定义 ManytoMany 关系的示例,以及如何在 JPA Controller (Java-ee-5) 中对其进行管理或您生成的无状态 session bean (Java-EE-6)。

View 部分的逻辑方法是添加一个创建表单,例如:

<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 - 作者)解释了在 Netbeans (Java-EE-6) 中支持 Many2Many 关系的方法。 http://ikennaokpala.wordpress.com/2010/06/18/persisting-jpa-many-to-many-relationship/

关于java - 使用 Netbeans 和 JSF 搭建 ManyToMany 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6357549/

相关文章:

jsf - 使用 JSF 单击按钮后重置 inputText

java - JSF <trh :script>rendering and running order

java - Netbeans 8.0 和网络项目太慢

Java - PDFBox - 文本提取

java - ORM + 关系数据库可以被认为是对象关系数据库管理系统吗?

java - 是否可以在 Java 中进行猴子修补,如果不能,是否有其他选择?

java - 重构JSP页面

php - 通过 PEAR 安装 phpunit 后如何获得 phpunit.bat?

java - IDE 能否在运行前识别出所有编译错误?

java - UISpec4J 和外部应用程序