0

Ebean で Play Framework 2 を使用しています。Personというクラスがあります。Person には Passport と DriverLicence の 2 つのインターフェイスがあります。Person には、passportNum と driverLicenceNum の 2 つの変数があります。Passport と DriverLicence には、DriverLicenceController と PassportController によって制御される独自の CRUD があります。DriverLicenceController から driverLicenceNum を更新しようとすると、ValidationException がスローされます。問題の原因は @Column(nullable = false) であることがわかりました。そして、更新から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();
}
}
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、これはまだ変更されていないため null です。次に、idの を設定しpersonObjて更新します (スーパー コールで)。

ValidationException列の 1 つが null であり、null 許容制約に違反しているため、この最後のステップで がスローされます。

手順 3 の前に次の手順を実行して、パスポート番号が null にならないようにすることで、これを簡単に解決できます。

personObj.passportNum = person.passportNum;

それらのフィールドの 1 つだけを変更するより多くのフィールドとフォームを持つクラスがある場合は、単純にデータベースからオブジェクトを取得し、1 つのフィールドを変更して、データベースからそのオブジェクトに変更する方が簡単ですupdate()。(必要に応じてオーバーロードすることもできます)あなたの例では、コードは次のようになります。

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