与 Beans 和 Play 合并的最佳方式 Java
The best way to merge with Beans and Play Java
我正在尝试将 Play 2.3.x 用于一个小项目。我已经习惯了 1.2.x,并且正在努力理解一些变化。
变化之一是使用 EBeans 和表单。这在 1.2.x 中非常有效,但我不太明白如何在 2.3.x
中做到这一点
我有控制器:
package controllers;
import models.Device;
import play.data.DynamicForm;
import play.data.Form;
import play.mvc.Controller;
import play.mvc.Result;
import java.util.List;
public class Devices extends Controller {
public static Result index() {
List<Device> devices = Device.find.all();
return ok(views.html.Devices.index.render(devices));
}
public static Result add () {
Form<Device> myForm = Form.form(Device.class);
return ok(views.html.Devices.add.render(myForm));
}
public static Result edit(Long id){
Device device = Device.find.byId(id);
Form<Device> myForm = Form.form(Device.class);
myForm = myForm.fill(device);
return ok(views.html.Devices.edit.render(myForm));
}
public static Result update() {
Device device = Form.form(Device.class).bindFromRequest().get();
device.update();
return index();
}
}
我可以添加一个设备,并想对其进行编辑。这是模板:
@(myForm: Form[Device])
@main("Edit a device") {
@helper.form(action = routes.Devices.update()) {
@helper.inputText(myForm("name"))
@helper.inputText(myForm("ipAddress"))
<input type="submit" value="Submit">
}
<a href="@routes.Devices.index()">Cancel</a>
}
但是如何将更改与已存储的对象合并?有没有简单的方法,还是我找到了对象,然后手动逐个字段地遍历对象?在 1.2.x(使用 JPA)中,有一个 merge() 选项可以处理所有这些。我会使用 JPA,但 1.2.x 中的默认支持似乎并不那么强大。
现在我得到(可以理解):
[OptimisticLockException: Data has changed. updated [0] rows sql[update device set name=?, ip_address=?, last_update=? where id=?] bind[null]]
这种乐观锁是由于您的表单中缺少 id
值而导致的,您在编辑表单中使用 id 的情况很好:
<input type="hidden" value="@myForm("id")">
无论如何正确的代码是:
<input type="hidden" name="id" value="@myForm("id").value">
两个提示:
- 您可以在 Idea 中设置断点 - 因此在调试模式下您可以识别绑定
device
的 id
为空。
- 在您的字段上使用约束时,您还应该处理操作中的错误
正确的可以是这样的,也可以在最后看到更新成功后如何重定向到索引:
public static Result update() {
Form<Device> deviceForm = Form.form(Device.class).bindFromRequest();
if (deviceForm.hasErrors()) {
return badRequest(views.html.Devices.edit.render(deviceForm, listOfRoles()));
}
// Form is OK, has no errors, we can proceed
Device device = deviceForm.get();
device.update(device.id);
return redirect(routes.Devices.index());
}
listOfRoles()
只是来自您的 edit()
操作的包装代码:
private static List<String> listOfRoles(){
List<String> list = new ArrayList<String>();
for(DeviceRole role : DeviceRole.values()) {
list.add(role.toString());
}
return list;
}
我正在尝试将 Play 2.3.x 用于一个小项目。我已经习惯了 1.2.x,并且正在努力理解一些变化。
变化之一是使用 EBeans 和表单。这在 1.2.x 中非常有效,但我不太明白如何在 2.3.x
中做到这一点我有控制器:
package controllers;
import models.Device;
import play.data.DynamicForm;
import play.data.Form;
import play.mvc.Controller;
import play.mvc.Result;
import java.util.List;
public class Devices extends Controller {
public static Result index() {
List<Device> devices = Device.find.all();
return ok(views.html.Devices.index.render(devices));
}
public static Result add () {
Form<Device> myForm = Form.form(Device.class);
return ok(views.html.Devices.add.render(myForm));
}
public static Result edit(Long id){
Device device = Device.find.byId(id);
Form<Device> myForm = Form.form(Device.class);
myForm = myForm.fill(device);
return ok(views.html.Devices.edit.render(myForm));
}
public static Result update() {
Device device = Form.form(Device.class).bindFromRequest().get();
device.update();
return index();
}
}
我可以添加一个设备,并想对其进行编辑。这是模板:
@(myForm: Form[Device])
@main("Edit a device") {
@helper.form(action = routes.Devices.update()) {
@helper.inputText(myForm("name"))
@helper.inputText(myForm("ipAddress"))
<input type="submit" value="Submit">
}
<a href="@routes.Devices.index()">Cancel</a>
}
但是如何将更改与已存储的对象合并?有没有简单的方法,还是我找到了对象,然后手动逐个字段地遍历对象?在 1.2.x(使用 JPA)中,有一个 merge() 选项可以处理所有这些。我会使用 JPA,但 1.2.x 中的默认支持似乎并不那么强大。
现在我得到(可以理解):
[OptimisticLockException: Data has changed. updated [0] rows sql[update device set name=?, ip_address=?, last_update=? where id=?] bind[null]]
这种乐观锁是由于您的表单中缺少 id
值而导致的,您在编辑表单中使用 id 的情况很好:
<input type="hidden" value="@myForm("id")">
无论如何正确的代码是:
<input type="hidden" name="id" value="@myForm("id").value">
两个提示:
- 您可以在 Idea 中设置断点 - 因此在调试模式下您可以识别绑定
device
的id
为空。 - 在您的字段上使用约束时,您还应该处理操作中的错误
正确的可以是这样的,也可以在最后看到更新成功后如何重定向到索引:
public static Result update() {
Form<Device> deviceForm = Form.form(Device.class).bindFromRequest();
if (deviceForm.hasErrors()) {
return badRequest(views.html.Devices.edit.render(deviceForm, listOfRoles()));
}
// Form is OK, has no errors, we can proceed
Device device = deviceForm.get();
device.update(device.id);
return redirect(routes.Devices.index());
}
listOfRoles()
只是来自您的 edit()
操作的包装代码:
private static List<String> listOfRoles(){
List<String> list = new ArrayList<String>();
for(DeviceRole role : DeviceRole.values()) {
list.add(role.toString());
}
return list;
}