0

我正在将 Play Framework 2 与 Ebean 一起使用。我有一堂课说人。Person 有 2 个接口,Passport 和 DriverLicence。Person 有 2 个变量,passportNum 和 driverLicenceNum。Passport 和 DriverLicence 有自己的 CRUD,由 DriverLicenceController 和 PassportController 控制。当我尝试从 DriverLicenceController 更新 driverLicenceNum 时,它会引发 ValidationException。我发现问题是由@Column(nullable = false) 引起的。我尝试从更新中打印出 passportNum 值,发现在 controller.update 中,passportNum 有一个值。但在 Person.update 中,它为空。请帮忙。以下是我的代码:

public class Person extends Model {
    public interface Passport{}
    public interface DriverLicence{}

    @Id
    public Long id;
    @Required(groups = {Passport.class})
    @Column(nullable = false)
    public Long passportNum;

    @Required(groups = {DriverLicence.class})
    @Column(nullable = false)
    public Long driverLicenceNum;

    @Override
    public void update(Object o) {
        this.updatedOn = new DateTime();
        Logger.debug("Passport: "+this.passportNum); // NULL
        super.update(o);
    }
}

public class DriverLicenceController extends Controller {
    public static Result update(long personId) {
    Person person = Person.find.byId(personId);

    if(visit == null) {
        flash("error", "does not exist.");
        return DriverLicenceController.home();
    }

    Form<Person> personForm = form(Person.class, Person.DriverLicence.class).fill(person).bindFromRequest();
    if(personForm.hasErrors()) {
        flash("error", "DriverLicence has not been updated");
        return badRequest();
    }

    Person personObj = personForm.get();
    Logger.info("Password num: "+person.passPortNum); //display the number
    personObj.update(personId);        
    return ok();
}
}
4

1 回答 1

1

基本上发生的事情是这样的:

1: Person personObj = personForm.get();
根据表单中的信息创建一个新的 Person 对象,这将设置此人的驾驶执照,但不会设置其 ID 和护照。

2: Logger.info("Password num: "+person.passPortNum); //display the number
您打印出之前从数据库中检索到person的对象的护照号码。

3: personObj.update(personId);
这会打印出 的护照号码,该号码personObj仍未更改,因此为空。然后它设置idpersonObj更新它(在超级调用中)。

这最后一步抛出了,ValidationException因为其中一列是空的,这违反了可空约束。

您可以通过在步骤 3 之前执行以下操作来简单地解决此问题,以避免护照号码为空:

personObj.passportNum = person.passportNum;

如果您有具有更多字段的类和仅更改其中一个字段的表单,则更容易从数据库中获取对象,更改一个字段并从数据库中更改update()为该对象。(如有必要,您也可以重载)在您的示例中,您的代码将是:

Person personObj = personForm.get();
person.driverLicenceNumber = personObj.driverLicenceNumber;
person.update(); // Id and other fields already set
于 2013-06-07T14:23:42.357 回答