Morphia: @PrePersist запускается при обновлении документа

У меня есть сущность пользователя. Когда я сохраняю пользовательский документ в коллекции, я хеширую пароль с помощью @PrePersist, но Morphia также вызывает @PrePersist, когда я пытаюсь обновить документ без пароля.

@PrePersist
void prePersist() {
    if (password != null) {
        System.out.println(password);
        PasswordService service = new DefaultPasswordService();
        password = service.encryptPassword(password);
    }
}

Это моя операция обновления.

@Override
public void updateWithoutPassword(T user) {
    Query <T> query = userDAO.createQuery();
    query.and(
            query.criteria("_id").equal(user.getId())
    );
    UpdateOperations <T> updateOperations = userDAO.createUpdateOperations();
    updateOperations.set("username", user.getUsername());
    updateOperations.set("name", user.getName());
    updateOperations.set("surname", user.getSurname());
    updateOperations.set("department", user.getDepartment());
    updateOperations.set("roles", user.getRoles());
    userDAO.update(query, updateOperations);
}

Когда я вызываю updateWithoutPassword(), @PrePersist работает, и значение пароля является старым значением пароля и пытается снова хэшировать старый пароль. Что я делаю неправильно?


person molgun    schedule 07.12.2013    source источник


Ответы (1)


Вместо этого вам, вероятно, следует хэшировать свой пароль в setPassword(). @PrePersist будет работать всегда.

person evanchooly    schedule 07.12.2013
comment
Спасибо, теперь это работает, но, согласно документации Morphia, @PrePersist запускается перед сохранением, а не обновлением. '{{{@PrePersist}}} — вызывается перед сохранением и может вернуть объект DBObject вместо пустого.' - person molgun; 07.12.2013
comment
Это изменилось? Я почти уверен, что @prePersist не работал с обновлениями - по крайней мере, до перехода на GitHub (официальной версии) - person xeraa; 07.12.2013
comment
О, мой плохой. Я неправильно это понял. @PrePersist всегда вызывается при работе с объектами через save(), например. UpdateOperations даже не касаются объектов, поэтому не о чем беспокоиться о жизненных циклах. Если вы видите, что ваши преперсистские методы жизненного цикла работают, я бы предложил добавить новый Exception().printStackTrace() и посмотреть, какое дерево вызовов для этого. Я достаточно уверен, что это не этот метод, а та трассировка стека, которая должна нам сказать. - person evanchooly; 07.12.2013