在crud Play 1.2.4中,如何使用复合键路由到默认的EDIT模板?

7

我在数据库中有一个由用户ID和用户角色组成的复合键。

为了将数据库与模型进行映射,以下是代码:

    @Id
@Column(name="ID")
public int userId;
@Id
    @Column(name="USER_ROLE")
public String userRole;
......
    ......
    @Override
public String toString() {      
    return userId;
}

目前,我能够显示用户列表并添加新用户到我的应用程序。但是,当我尝试通过单击用户ID路由到默认的“编辑”模板时,会出现错误:“没有路由”。
此外,我注意到在单击用户时,组合 ID 没有作为 URL 发送,实际上某些对象被附加在 URL 的末尾(这可能是原因之一)。
请告诉我如何显示默认的编辑屏幕,当我们在数据库中有一个组合键时。我已经困扰了这个问题很长时间,但没有在文档中找到任何参考资料。 :(

被OP提到的附加到URL末尾的对象显然将由默认的toString方法生成。我假设这需要被覆盖; 但是我不知道如何这样做,以便正确的基础模型将被编辑。 - Dexygen
你能展示一下你用来生成URL的代码吗? - Magnus
1个回答

2

Play CRUD 控制器无法很好地处理复合键。以下是解决方法。

首先,决定一个字符串格式的复合键 - 在下面的示例中,我只取了两个键(ssn,accountId)并用“-”分隔它们进行了串联。

在您的模型中,按照以下方式重写 GenericModel 和 JPABase 的 _keyfindById 方法:

package models;

import play.db.jpa.GenericModel;

import javax.persistence.Entity;
import javax.persistence.Id;    

@Entity
public class Part extends GenericModel {
    @Id
    public int ssn;
    @Id
    public int accountId;
    public String name;

    /**
     * Find a part by its composite id ("ssn-accountId")
     */
    public static Part findById(String id) {
        // Split the composite id to extract ssn and accountId
        String[] elements = id.split("-");
        int ssn = Integer.valueOf(elements[0]);
        int accountId = Integer.valueOf(elements[1]);

        return Part.find("ssn=? AND accountId=?", ssn, accountId).first();
    }

    /**
     * Return a composite id ("ssn-accountId")
     */
    public String _key() {
        return ssn + "-" + accountId;
    }
}

接下来在您的控制器中重写show方法:

    package controllers;

    import models.Part;

    public class Parts extends CRUD {

    /**
     * CRUD show method doesn't know how to handle composite ids.
     *
     * @param id composite of ssn + "-" + accountId
     * @throws Exception
     */
    public static void show(String id) throws Exception {
        // Do not rename 'type' or 'object'
        ObjectType type = ObjectType.get(getControllerClass());
        notFoundIfNull(type);
        Part object = Part.findById(id);
        notFoundIfNull(object);
        render("CRUD/show.html", type, object);
    }
}

好的,我会尽力而为。


@DidarBurmaganov,你可能在开玩笑! - Nurlan
CRUD不支持编辑简单主键,因此如果您尝试编辑复合键,则可能会发生糟糕的事情。如果可能的话,请避免使用复合键-引入替代/技术键。如果需要ssn-accountId是唯一的,则还应添加约束。 - ct_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接