实际上,无论数据库供应商是什么,使用 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/