2013-05-31 38 views
0

我在Ebean中使用Play Framework 2。 我有一個班級說人。人有2個接口,護照和DriverLicence。 人有2個變量,passportNum和driverLicenceNum。 Passport和DriverLicence擁有自己的CRUD,由DriverLicenceController和PassportController控制。當我嘗試從DriverLicenceController更新driverLicenceNum時,它會引發ValidationException。我發現問題是由@Column(nullable = false)引起的。我試圖從更新中打印出passportNum值,並發現在controller.update中,passportNum有一個值。但在Person.update中,它是空的。請幫忙。下面是我的代碼:播放框架Ebean有奇怪的行爲,更新時爲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

基本上正在發生的事情是這樣的:

1: Person personObj = personForm.get();
創建基於形式的信息的新的Person對象,這將設置人駕駛執照,但不是其身份證和護照。

2: Logger.info("Password num: "+person.passPortNum); //display the number
您打印出以前從數據庫中檢索的person對象的護照號碼。

3: personObj.update(personId);
這打印出personObj的護照號碼,仍然沒有改變那麼爲空。然後它設置personObjid並更新它(在超級調用中)。

最後一步拋出ValidationException,因爲其中一列爲空,違反了可空約束。

你可以簡單地通過執行以下操作前第3步,以避免護照號碼是空解決這個問題:

personObj.passportNum = person.passportNum; 

如果你有更多的領域和形式的改變只有這些領域的1類,它的從數據庫中簡單地獲取對象,更改一個字段並從數據庫中更改爲update()。 (如果需要,您也可以重載)在您的示例中,您的代碼將爲:

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