Строительные леса ManyToMany ассоциируются с Netbeans и JSF - PullRequest
1 голос
/ 15 июня 2011

Я занимаюсь разработкой приложения JEE6 JSF с использованием NetBeans и его функций разработки RAD. Я хочу использовать строительные леса, чтобы сэкономить время на обновление контроллеров и представлений моделей. Ассоциации OneToMany генерируются в представлениях без каких-либо проблем (как раскрывающийся список, позволяющий выбрать родительский объект), но ассоциации ManyToMany не создаются.

Знаете ли вы, как создать множество ассоциаций ManyToMany? Какие методы RAD вы используете с NetBeans? (плагины, учебники, материалы, которые вы рекомендуете)

Ответы [ 2 ]

3 голосов
/ 16 июня 2011

На самом деле, леса 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/

0 голосов
/ 20 июня 2011

Вы можете попробовать альтернативу в Netbeans 7.0, которая использует JSP в качестве технологии просмотра вместо Facelets (XHTML).Если вы это сделаете, IDE сгенерирует другой код для Managed Beans и добавит служебный класс: JsfElResolver.java, который будет вызываться при каждом действии пользователя, чтобы разрешить переход между родителем и потомком так же, как и при отправке форм.Отношение Many2Many частично поддерживается в этом случае, но обычно оно работает, если ваша база данных хорошо спроектирована.

Как и то, что вы назвали плагином, в этом случае используйте PrimeFaces или OpenFaces как представление обращено к библиотеке.Эти две библиотеки не нуждаются в болезненной настройке и безупречно работают со скаффолдингом JSF CRUD в Netbeans.За исключением Primefaces Datatable фильтрации и сортировки, которая глючит при использовании DataModel.

...