سؤال

كيف يمكنني تحديث مجموعة معينة فقط من الحقول إلى قاعدة البيانات باستخدام Play؟حاليا لدي User النموذج الذي يحتوي على حقل معين، دعنا نسميه: isAdministrator:

private boolean isAdministrator;

ولدي طرق الوصول:

/**
 * @return the isAdministrator
 */
public boolean isAdministrator() {
    return isAdministrator;
}

/**
 * @param isAdministrator
 *            the isAdministrator to set
 */
public void setAdministrator(boolean isAdministrator) {
    this.isAdministrator = isAdministrator;
}

ولكن عندما أقوم بتغيير اسم المستخدم، عبر نموذج حيث isAdministrator لم يتم تضمينه، يقوم Play بإعادة تعيين كائنات المستخدم الخاصة بي ويحدد القيمة 0 لهذا المستخدم؟

إذن، كيف يمكنني تحديث الحقول التي تم تغييرها فقط؟

هل كانت مفيدة؟

المحلول

لا أجيب مباشرة على سؤالك، ولكن بدلاً من وجود قيمة منطقية تشير إلى أن المستخدم الخاص بك هو مسؤول أم لا، سأقوم بإنشاء Admin الفئة التي ترث من المستخدم.

public class Admin extends User {
....
}

انها ال "س" ل صلب ;-)

يحرر:

في وحدة التحكم، يمكنك تحميل القيمة القديمة من قاعدة البيانات قبل التحديث بقيم النموذج:

...
User userFromDB = User.findById(anId);
User userFromForm = userForm.get();

// set previous value
userFromForm.setArchived(userFromDB.getArchived());

User.update(userFromForm);
...

نصائح أخرى

بالإضافة إلى نيكو الإجابة التي يمكنني إضافتها فقط هي أنك لا تحتاج إلى استخدامها Form الطبقة في كل حالة.في بعض الأحيان يكفي مجرد الحصول على البيانات من الطلب وتحديث الكائن يدويًا وهو أمر مفيد خاصة مع مكالمات ajax عندما يكون لديك مستوى تفصيلي من الحفظ المتوسط ​​(راجع مثال استخدام نموذج ديناميكي يمكن أن يكون أقصر وأيضًا يمكنك التحقق من صحة ذلك بنفسك:

public static Result updateName(Integer id){
    User user = User.find.byId(id);
    user.name = form().bindFromRequest().get("name");
    user.update(id);
    return ok();
}

يمكنك تحديد الحقول التي تريد تحديثها.قل أنك تريد تحديث اسم ثم ستفعل مثل هذا:

Ebean.update(user, new HashSet<String>(Arrays.asList("name")));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top