Автозаполнение Set

Есть что-нибудь подобноеAutoPopulatingList но дляSet? Данные, которые я хочу показать, являются ассоциацией, которая использует .I 'Set

public class Employer implements java.io.Serializable {
     private Set employees = new HashSet();
}

мы пытались использоватьAutoPopulatingList но в этом случае я должен использоватьList в спящем режиме, который мне нужно указатьlist-index с помощьюEmployee.employeeId и всякий раз, когда я получаюemployees черезEmployee позже в списке будут пробелы между элементами (null элементы) в зависимости от.Employee.employeeId

Мне нужно автоматически заполнить коллекцию, потому что мне нужно создатьemployees динамически при созданииEmployer, Я получил следующее, когда я использую обычный:Setorg.springframework.beans.InvalidPropertyException: Invalid property 'employees[0]' of bean class [model.Employer]: Cannot get element with index 0 from Set of size 0, accessed using property path 'employees[0]'

Есть ли другое решение?

Editi»

я пытаюсь реализовать динамическую форму

 Pavel Horal08 июн. 2013 г., 19:44
Вы пытаетесь создавать динамические формы? Или чего вы пытаетесь достичь этим подходом?
 verdy09 июн. 2013 г., 05:25
@PavelHoral точно, динамические формы. Однако я не думаю, что я могу использоватьList как будто я используюList сEmployee.employeeId как индекс в файле HBM, список будет иметь пробелы между элементом (элемент сnull значение) всякий раз, когда я получаю его позже из базы данных

Ответы на вопрос(3)

В индексированной коллекции вы можете связывать только индексированные коллекции или массивы. Вы можете попробовать использовать LinkedHashSet (у которого есть гарантированный порядок, тогда как HashSet неt) или использовать реализации List для привязки значений. "

Решение Вопроса

Set в качестве цели привязки в MVC, поскольку невозможно создать путь свойства для его элементов.

Что вы должны использовать

Вы должны использоватьMap при построении динамических форм. То, что мы реализовали много раз (поэтому я знаю, что это работает), это:

простая последовательность номеров используется в качестве ключей без какой-либо связи с фактическими элементамипоследовательность клавиш постоянно увеличивается, но нене должно быть непрерывным (например, в случае, если пользователь удалит второй элемент, вы получите в итоге)1, 3, 4, ...если вы хотите добавить еще один элемент, вы просто находите наибольшее число, а затем добавляете форму с индексомmaxIndex + 1 (всегда увеличивающаяся последовательность)Map реализацияДОЛЖНО БЫТЬ экземплярLinkedHashMap так что порядок итераций сохраняется (Spring создает эту реализацию по умолчанию, еслиMap поле должно быть заполнено автоматически)Map должен быть частью некоторого родительского объекта формы (то есть вы не можете иметьMap в качестве объекта верхней формы), чтобы Spring мог выводить универсальные типы из свойства getterПросмотр и пример реализации JavaScript

Есть много способов, как вы можете работать с этим. Например, у нас есть специальныйшаблонная форма, который используется, когда нам нужно динамически добавить другую подчиненную форму. Этот подход, вероятно, немного сложнее для подражания:

<form:form action="${formUrl}" method="post" modelattribute="organizationUsersForm">
    <%-- ... other fields ... --%>
    <div id="userSubforms">
        <c:foreach items="${organizationUsersForm.users.entrySet()}" var="subformEntry">
            <div data-subform-key="${subformEntry.key}">
                <spring:nestedpath path="users['${subformEntry.key}']">
                    <%@ include file="user-subform.jspf" %>
                </spring:nestedpath>
            </div>
        </c:foreach>
    </div>
    <button onclick="addSubform(jQuery('#userSubforms'), 'users', 'user', 'userTemplate');">ADD ANOTHER USER</button>
    <%-- other form fields, submit, etc. --%>
</form:form>

<div class="hide" data-subform-template="user">
    <spring:nestedpath path="userTemplate">
        <%@ include file="user-subform.jspf" %>
    </spring:nestedpath>
</div>

<script>
    function addSubform(subformContainer, subformPath, templateName, templatePath) {
        // Find the sequence number for the new subform
        var existingSubforms = subformContainer.find("[data-subform-key]");
        var subformIndex = (existingSubforms.length != 0) ?
                parseInt(existingSubforms.last().attr("data-subform-key"), 10) + 1 : 0;
        // Create new subform based on the template
        var subform = jQuery('<div data-subform-key="' + subformIndex + '" />').
                append(jQuery("[data-subform-template=" + templateName + "]").children().clone(true));
        // Don't forget to update field names, identifiers and label targets
        subform.find("[name]").each(function(node) {
            this.name = subformPath + "["+ subformIndex +"]." + this.name;
        });
        subform.find("[for^=" + templatePath + "]").each(function(node) {
            this.htmlFor = this.htmlFor.replace(templatePath + ".", subformPath + "["+ subformIndex +"].");
        });
        subform.find("[id^=" + templatePath + "]").each(function(node) {
            this.id = this.id.replace(templatePath + ".", subformPath + "["+ subformIndex +"].");
        });
        // Add the new subform to the form
        subformContainer.append(subform);
    }
</script>

Теперь вы можете спроситьКак пользователь может удалить подчиненную форму?? Это довольно легко, если JSPF подчиненной формы содержит:

<button onclick="jQuery(this).parents('[data-subform-key]').remove();">DELETE USER</button>

.. наборы не индексируются на основе, чтобы начать с ..

почему Дон'т вы используете LazyList сотрудника .. как правильно указано @PavelHoral, мы неНеобходимо использовать LazyList, как это делает Spring. Простая инициализация List (как и новый ArrayList ()) могла бы быть, хотя и с возможностью иметь пробелы (нули), когда пользователь отправляет непостоянные элементы.

private List<employee> employees = new ArrayList<employee>();
</employee></employee>
 verdy09 июн. 2013 г., 05:30
Это совместимо сSet? потому что если я используюList и я используюEmployee.employeeId вlist-index всякий раз, когда я получаюemployees сквозьEmployer позжеemployee List будет иметьnull элемент между ними в зависимости отEmployee.employeeId
 Vaibhav Behl09 июн. 2013 г., 07:50
так что да, между ними будут пробелы (null), но с помощью LazyList, если вы попытаетесь получить доступ к этим пустым местам, будет возвращен вновь созданный объект.
 verdy09 июн. 2013 г., 08:13
Но тогда, если я пойду с этой реализацией, когда я переберуList это создаст новый экземпляр пустогоEmployee каждый раз, когда он находитnull объект, который позже также приведет к отображению объекта на веб-странице
 Vaibhav Behl09 июн. 2013 г., 16:13
@PavelHoral я попробовал
 Vaibhav Behl09 июн. 2013 г., 09:03
@verdy также повторяет LazyListсоздать бесконечный список, потому что мы выполняем итерацию только до длины списка.
 Vaibhav Behl09 июн. 2013 г., 07:46
от LazyList 'документация-Возвращает "ленивый» список, элементы которого будут созданы по запросу. "так что всякий раз, когда вы получаете / получаете доступ к любому сотруднику, если это нене существует этовернем экземпляр, созданный внутриcreate() метод .. "совместим с Set "- Задавать'Если структура данных используется, когда пользователь хочет сохранить уникальность в структуре данных, вы можете добиться того же эффекта, используя EployeeId в list-index.
 Vaibhav Behl23 июн. 2013 г., 14:00
@PavelHoral спасибо, вы правы, я использую Tomcat 6.
 Pavel Horal10 июн. 2013 г., 00:25
@VaibhavBehl, если вы получаете ошибки, вызывающие функции из EL, значит, у вас старая версия EL. Это поддерживается с версии 2.2. Обновление до нового контейнера сервлета может помочь.
 Pavel Horal09 июн. 2013 г., 11:52
Spring может вывести общий тип коллекции из метода получения свойств. ТакжеBeanWrapperImpl может самому расти коллекции, так что нет необходимости в таких конструкциях, какLazyList... пусть эти устаревшие конструкции мирно умирают :).
 Vaibhav Behl09 июн. 2013 г., 08:56
Вы не должны проходить вработодателя модель непосредственно к форме JSP, так что теперь вы можете отобразить с помощью Set <Сотрудник> в 'работодателя и настаивать на том, что с помощью Hibernate .., а затем создать класс проекции (форма), который имеет список <Сотрудник> используя Модель Работодателя и передавая ее туда-сюда между взаимодействиями пользователей, также теперь список индексов выигралне может быть идентификатором сотрудника, но некоторым целым числом, в зависимости от порядка, который вы вставили в список ... и после того, как пользователь отправит форму, вы можете выполнить итерацию списка, чтобы исключить возможные пустые значения (проверьте наличие поля Emplyee, которое может 'возможно, будет нулевым идентификатором)

Ваш ответ на вопрос