Значения полей не изменяются при обратном вызове PreUpdate

1

Я определил следующий класс как стандартный Entity Listener, поэтому каждый раз, когда я вызываю методы persist() или merge(), этот код будет выполнен автоматически:

public class StringProcessorListener {

    @PrePersist
    @PreUpdate
    public void formatStrings(Object object) {
        try {
            for (Field f : object.getClass().getDeclaredFields()) {
                if (f.getType().equals(String.class)) {
                    f.setAccessible(true);
                    if (f.get(object) != null) {
                        f.set(object, f.get(object).toString().toUpperCase());
                    }
                }
            }
        } catch (Exception ex) {
            Logger.getLogger(StringProcessorListener.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Целью этого является использование всех строк объекта перед его вставкой в базу данных. @PrePersist работал отлично, метод изменяет все строки и сохраняет его в записях в базе данных, но когда я пытаюсь обновить объект, он не работает так хорошо, метод вызывается нормально, а также изменяет строки, но вместо сохранения измененного объекта в базе данных он сохраняет объект так же, как и до этого метода.

Любые идеи о том, как это решить?

Обновить:

Я решил его с помощью DescriptorEvent, он дал мне доступ к ObjectChangeSet, и я мог бы его вручную обновить, а затем значения были правильно сохранены в базе данных.

  • 0
    Как насчет выполнения UpperCase () перед сохранением или обновлением, например, в объекте setUser вы можете просто выполнить user = user.uppercase ()
  • 0
    Я мог бы сделать это, но мне пришлось бы изменить много кода в моем проекте, у меня более 300 объектов, и для этого потребовалось бы слишком много работы.
Показать ещё 4 комментария
Теги:
jpa
entitymanager
ejb
entitylisteners

1 ответ

1

Если вы работаете в среде сервера или используете агент для плетения, EclipseLink по умолчанию будет использовать отслеживание изменений, если это возможно по соображениям производительности. Если это так, ваш метод непосредственного задания значений в объекте обходит сплетенный код замены, поэтому EclipseLink не знает об изменениях. O persist, он использует все значения непосредственно из объекта, в то время как при обновлениях он использует только измененные поля, и он будет знать только об изменениях через слушателей смены изменений. Вам нужно либо использовать доступ к методу для установки этих полей, либо отключить отслеживание изменений: http://eclipse.org/eclipselink/documentation/2.5/jpa/extensions/a_changetracking.htm

Ещё вопросы

Сообщество Overcoder
Наверх
Меню