【问题标题】:How does Seam Framework handle composite primary keys in pages.xml using EntityHome?Seam Framework 如何使用 EntityHome 处理 pages.xml 中的复合主键?
【发布时间】:2010-10-26 12:59:51
【问题描述】:

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>

这会将(原子)ID 从 URL 分配给 clubHome

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

但是使用复合主键应用实体的技术是什么?这里的key由(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 组件中的成员变量,当然需要具有相应 getter 和 setter 的 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;
    }

}

在 pages.xml 中使用如下:

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

那么,这里的最佳做法是什么?我在“Seam in Action”和网上/网上都找不到任何使用复合主键的例子。

【问题讨论】:

    标签: jsf seam


    【解决方案1】:

    你可以使用下面的

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

    【讨论】:

    • @Kawu 当您有复合主键时,首选使用 id 以外的其他名称
    • @Pascal Thivent 没有空闲时间。我正在做一个消耗我时间的公司项目。它是开源的。我会在发布时通知您。还是谢谢你。
    • @Arthur:当它们是复合属性时,我从不调用属性 id(这里是 roundId)。
    • @Arthur:我的实体类都是生成的,它们只按照你描述的方式携带@Name 注释。这还不够吗?我需要 @Scope 和 @AutoCreate 做什么?
    • @Kawu @AutoCreate 指示 Seam 在不可用时创建您的组件。普通 POJO 的默认范围是 ScopeType.CONVERSATION。在复合主键类上使用 ScopeType.CONVERSATION 没有意义。所以我更喜欢使用 ScopeType.EVENT(每个请求)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    相关资源
    最近更新 更多