Play CRUD 控制器不适用于复合键。这是您可以解决的方法。
首先,确定复合键的字符串格式 - 在下面的示例中,我刚刚获取了两个键(ssn、accountId)并用“-”将它们连接起来。
在您的模型中覆盖 GenericModel 和 JPABase 中的_key
和findById
方法,如下所示:
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);
}
}
而已。