Seam Framework如何使用EntityHome在pages.xml中处理复合主键?

时间:2010-10-26 12:59:52

标签: jsf seam

Seam Framework如何使用EntityHome在pages.xml中处理复合主键?

通常的方法是为entityHome组件分配ID,例如:

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

这会从URL

将(原子)ID分配给clubHome

http://...?club=12345 ...

但是应用使用复合主键的实体的技术是什么?这里的密钥由(roundId,ordinalNumber)组成,给出一个URL

http://...?round=143&group=1 ...

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

以上是为groupHome分配新的复合ID的非工作尝试。这里的问题是如何引用URL参数。 (有没有办法在pages.xml中创建临时变量?)

除此之外,除了将原子PK属性分配给一个或多个不同的EntityHome组件中的成员变量之外,我没有别的办法,当然要求EntityHome子类具有resprective getter和setter:

@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;
    }

}

在pages.xml中使用如下:

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

那么,这里的最佳做法是什么?我既无法在“Seam in Action”中找到使用复合主键的示例,也无法在网络中找到任何示例。

1 个答案:

答案 0 :(得分:2)

您可以使用以下

将您的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>