Play Framework Ebean具有奇怪的行为,更新时为null

时间:2013-05-31 07:23:48

标签: playframework-2.0 nullable ebean

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

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();
}
}

1 个答案:

答案 0 :(得分:1)

基本上发生的事情是:

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

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

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

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

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

ValidationException

如果您的类具有更多字段和表单,只能更改其中一个字段,则可以更轻松地从数据库中获取对象,从数据库中更改一个字段和personObj.passportNum = person.passportNum; 该对象。 (如果需要,您也可以重载)在您的示例中,您的代码将是:

update()