На самом деле, леса JSF с Netbeans еще не способны управлять отношениями Many2Many независимо от того, кто является поставщиком базы данных.То же самое для представлений базы данных.
Как вы можете заметить, когда вы хотите сгенерировать сущности из базы данных, будут приниматься только таблицы с идентификатором (первичным ключом).Тем не менее, мастер распознает соединительные таблицы и правильно аннотирует сущности.На первый взгляд (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 (Managed Beans и контроллеры JPA)если необходимо, если они отличаются от приведенного выше примера.
Поскольку EclipseLink является профайлером JPA по умолчанию, используемым Netbeans, вам следует проверить сайт EclipseLink, чтобы увидеть примеры того, как отношения ManytoMany определены в классах сущностей, ипосмотрите, как это управляется в сгенерированном вами контроллере JPA (Java-ee-5) или сессионных компонентах без сохранения состояния (Java-EE-6).
Логическим способом добавления части вида было добавление в форму Createнапример:
<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 представлено коллекцией в классе Entity, поэтому здесь дело обстоит так: чтобы добавить коллекцию к объекту .
Я никогда не имел дело со связями «многие ко многим» в среде JSF, поэтому пока не могу сказать, как эффективно вносить эти изменения.Но вы можете напрямую спросить команду JSF на Netbeans.org.Или посмотрите, как ребята из SpringFuse решили проблему с помощью Spring (на самом деле они добавили addObject(){}
и removeObject(){}
методы в классы сущностей, связанные с отношением m2m.
/**
* 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);
}
Вы можете попробовать их онлайн JSF WebГенератор приложений и проверьте сгенерированный код, чтобы увидеть разницу между их и вашим, если вы не возражаете против использования Spring Framework для вашего приложения.
Однако вы можете проверить эту статью блога (учебное пособие), в которой объясняетсяспособ поддержки отношений Many2Many в Netbeans (Java-EE-6) на простом примере (Книга - AuthorBook - Автор). http://ikennaokpala.wordpress.com/2010/06/18/persisting-jpa-many-to-many-relationship/