Playframework 2.0 播放行为怪异的框架Ebean,更新时为null

Playframework 2.0 播放行为怪异的框架Ebean,更新时为null,playframework-2.0,nullable,ebean,Playframework 2.0,Nullable,Ebean,我正在使用Ebean的Play Framework 2。 我有一个班说人。人员有两个界面,Passport和DriverLicense。 Person有两个变量,passportNum和driverliceneum。Passport和DriverLicense有自己的CRUD,由DriverLicense控制器和PassportController控制。当我试图从DriverLicense控制器更新DriverLicense时,它抛出一个ValidationException。我发现问题是由@C

我正在使用Ebean的Play Framework 2。 我有一个班说人。人员有两个界面,Passport和DriverLicense。 Person有两个变量,passportNum和driverliceneum。Passport和DriverLicense有自己的CRUD,由DriverLicense控制器和PassportController控制。当我试图从DriverLicense控制器更新DriverLicense时,它抛出一个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();
}
}
公共类人员扩展模型{
公共接口Passport{}
公共接口驱动程序界面{}
@身份证
公共长id;
@必需(组={Passport.class})
@列(nullable=false)
公共长护照号码;
@必需(组={driverlience.class})
@列(nullable=false)
公共长距离驾驶室;
@凌驾
公共无效更新(对象o){
this.updatedOn=new DateTime();
Logger.debug(“Passport:+this.passportNum);//NULL
超级更新(o);
}
}
公共类DriverLicenceController扩展控制器{
公共静态结果更新(长personId){
Person=Person.find.byId(personId);
如果(访问==null){
闪光(“错误”,“不存在”);
返回DriverLicenceController.home();
}
Form personForm=表单(Person.class,Person.driverlience.class).fill(Person.bindFromRequest();
if(personForm.hasErrors()){
闪存(“错误”,“驱动器亮度未更新”);
返回请求();
}
Person personObj=personForm.get();
Logger.info(“Password num:+person.passPortNum);//显示数字
personObj.update(personId);
返回ok();
}
}

基本上发生的是:

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

2:
Logger.info(“密码编号:+person.passPortNum”)//显示号码

您可以打印出以前从数据库中检索到的
人员
对象的护照号

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

最后一步将抛出
ValidationException
,因为其中一列为null,这违反了null约束

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

personObj.passportNum = person.passportNum;
如果您有多个字段和表单的类,而这些字段和表单只改变其中的一个字段,那么只需从数据库中获取对象、改变一个字段并从数据库中更新该对象就更容易了。(如有必要,您还可以重载)在您的示例中,您的代码将是:

Person personObj = personForm.get();
person.driverLicenceNumber = personObj.driverLicenceNumber;
person.update(); // Id and other fields already set