Play + Ebean如何在编辑记录时保留主键?

时间:2014-05-06 01:06:36

标签: java playframework-2.0 ebean

我正在尝试将Play Framework与Ebean一起使用。我有一个非常简单的Java类Subject

@Entity
public class Subject extends Model {

    private static final long serialVersionUID = 1L;

    @Id
    public final int id;
    public String name;

    public Subject() {
        id = 0;
    }

    public Subject(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

我还有简单的编辑表单(views.subjects.edit.scala.html):

@(subjectForm: Form[models.entities.Subject], id: Int)
@import helper._
@main("Subject") {
@helper.form(action = routes.Subjects.save(id)) {
@helper.inputText(subjectForm("name"),'_label -> "Name")
<input type="submit" class="form-submit" value="Save">
<a class="button" href="@routes.Subjects.index()">Cancel</a>
}
}

字段id不可编辑(它是主键),这就是我不喜欢在表单输入元素中显示它的原因。因此,当我保存已编辑的Subject时,我需要执行类似

的操作
public static Result save(int id) {
    Form<Subject> form = subjectForm.bindFromRequest();
    if (form.hasErrors()) {
        flash("error", DATA_ERROR);
        return badRequest(edit.render(form, id));
    }
    Subject subject = form.get();
    if (id == 0) {
        // Add new record case
        subject.save();
    } else {
        // Edit existing record case
        Subject old = Subject.find.byId(id);
        if (old == null) {
            return notFound(NOT_FOUND);
        }
        old.setName(subject.getName());
        old.save();
        flash("success",
                String.format("Subject %s, %d saved",
                        old.getName(), old.getId()));
    }
    return redirect(routes.Subjects.index());
}

我只有一个问题。有没有办法从Subject获取具有正确(原始)ID的subjectForm实例?对数据库进行额外请求以更新记录似乎不是一个好的解决方案。但是当我从subjectForm id获取实例时总是为0.

1 个答案:

答案 0 :(得分:1)

如果您不想显示,请使用表单中的hidden字段:

<input type="hidden" name="id" value='@subjectForm("id").value' />

BTW:获取对象并更新它是自然的方式,或者你可以使用Ebean的SqlUpdate进行直接查询like in these samples

编辑:如果你要传递隐藏的ID,你也可以尝试在较短的版本中保存对象,如:

Subject subjectFromForm = subjectForm.bindFromRequest().get();
subjectFromForm.update(subjectFromForm.id);