Самоссылающаяся сущность - PullRequest
0 голосов
/ 17 мая 2011

У меня есть сущность с именем person .Каждый человек имеет три поля:

пол (мужчина, женщина) мать (самоссылка на человека) отец (самоссылка на человека)

Теперь, на мой взгляд, jspxЯ хотел бы, чтобы в двух выбранных полях отображались только женщины-персона в поле выбора матери и мужчины-мужчины в поле отца.Каков наилучший способ сделать это?

1 Ответ

3 голосов
/ 18 мая 2011

Прежде всего, вы должны создать динамический искатель, чтобы получить людей по sex. Введите в консоли Roo:

finder list

Затем найдите что-то вроде findPeopleBySex и наберите:

finder add --finderName findPeopleBySex

Если вы не хотите создавать этот искатель, вы можете добавить exposeFinders = false к аннотации @RooWebScaffold вашего PersonController.

Тогда вы должны открыть свой PersonController (какое тело, я полагаю, пустое) и поместить туда что-то вроде следующего:

@ModelAttribute("men")
public Collection<Person> populateMen() {
    return Person.findPeopleBySex(Gender.Male).getResultList();
}

@ModelAttribute("women")
public Collection<Person> populateWomen() {
    return Person.findPeopleBySex(Gender.Female).getResultList();
}

Наконец, откройте {project_root}/src/main/webapp/WEB-INF/views/people/create.jspx и найдите следующие строки:

    <field:select field="mother" id="c_xxx_Person_mother" itemValue="id" items="${people}" path="/people" z="xxx"/>
    <field:select field="father" id="c_xxx_Person_father" itemValue="id" items="${people}" path="/people" z="xxx"/>

И измените их на:

    <field:select field="mother" id="c_xxx_Person_mother" itemValue="id" items="${women}" path="/people" z="xxx"/>
    <field:select field="father" id="c_xxx_Person_father" itemValue="id" items="${men}" path="/people" z="xxx"/>

Убедитесь, что значение атрибута z (хеш-код) стало user-managed. Это означает, что Ру не изменит его в будущем.

Теперь вы можете запустить приложение и увидеть результат.

...