【问题标题】:Routing to default EDIT template with composite key in crud Play 1.2.4在 crud Play 1.2.4 中使用复合键路由到默认 EDIT 模板
【发布时间】:2013-06-08 04:11:05
【问题描述】:

我的数据库中有一个用户 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 方法生成的。我认为这需要被覆盖;但是我不知道该怎么做才能编辑正确的基础模型。
  • 你能展示你用来生成 URL 的代码吗?

标签: java web-applications playframework crud playframework-1.x


【解决方案1】:

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,你可能在开玩笑!
  • CRUD 不支持编辑简单的主键,所以我猜如果你尝试编辑复合键会发生不好的事情。如果可能的话,您应该避免使用复合键 - 引入 surrogate / technical key。如果您需要 ssn-accountId 是唯一的,那么还要添加一个约束。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
相关资源
最近更新 更多