Как Seam Framework обрабатывает составные первичные ключи в pages.xml, используя EntityHome? - PullRequest
1 голос
/ 26 октября 2010

Как Seam Framework обрабатывает составные первичные ключи в pages.xml с помощью EntityHome?

Обычный подход заключается в назначении идентификатора компоненту entityHome, например:

<page view-id="/team-list.xhtml">
  <param name="club" value="#{clubHome.id}" converterId="javax.faces.Integer" validatorId="javax.faces.LongRange" />
</page>

Это присваивает (атомарный) идентификатор clubHome с URL

HTTP: // ... клуб = 12345 ...

но что за техника применяется для сущностей, использующих составные первичные ключи? Здесь ключ состоит из (roundId, ordinalNumber), давая URL

HTTP: // ... круглый = 143 & группа = 1 ...

<page view-id="/standings.xhtml">
  <param name="group" value="#{groupHome.setId(new GroupId(round???, group???))}" />
</page>

Выше приведена нерабочая попытка назначить новый составной идентификатор для groupHome. Проблема здесь в том, как ссылаться на параметры URL. (Есть ли способ создать временные переменные в pages.xml?)

Кроме этого, я не вижу другого способа, кроме как назначить атомарные свойства PK для переменных-членов в одном или нескольких различных компонентах EntityHome, конечно же, требуя подклассы EntityHome с корректирующими средствами получения и установки:

@Name("groupHome")
public class GroupHome extends EntityHome<Group>
{
    // temp var
    private Integer ordinalNumber;

    public void setOrdinalNumber(Integer ordinalNumber)
    {
        this.ordinalNumber = ordinalNumber;
    }

    public Integer getOrdinalNumber()
    {
        return ordinalNumber;
    }

}

Используется как показано на стр. Xml:

<page view-id="/standings.xhtml">
  <param name="round" value="#{roundHome.id}" />
  <param name="group" value="#{groupHome.ordinalNumber}" />
</page>

Итак, какова лучшая практика здесь? Я не могу найти ни одного примера с использованием составных первичных ключей ни в «Шов в действии», ни в / в сети.

1 Ответ

2 голосов
/ 26 октября 2010

Вы можете использовать следующие

Отметьте свой GroupId как @Scope (ScopeType.EVENT)

@Name("groupId")
@Scope(ScopeType.EVENT)
@AutoCreate
public class GroupId implements Serializable {

    private Integer id;
    private Integer ordinalNumber;

}

Настройте свою страницу как

<page view-id="/standings.xhtml">
    <param name="round" value="#{groupId.id}" />
    <param name="group" value="#{groupId.ordinalNumber}"/>
    <action execute="#{groupHome.setId(groupId)}"/>
</page>
...