2014-09-25 3 views
1

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

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 работал отлично, метод изменяет все строки и сохраняет его в записях в базе данных, но когда я пытаюсь обновить объект, он не работает так хорошо, метод вызывается нормально, а также изменяет строки, но вместо сохранения измененного объекта в базе данных он сохраняет объект так же, как и до этого метода.

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

Update:

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

+0

Как насчет того, чтобы сделать UpperCase() перед сохранением или обновлением, например, в объекте setUser, вы можете просто сделать user = user. uppercase() – Rika

+0

Я мог бы это сделать, но мне пришлось бы изменить много кода в моем проекте, у меня более 300 объектов, и для этого потребуется слишком много работы. –

+0

Сохраняется ли работа сохранения, если вы просто добавили аннотацию PreUpdate? – Rika

ответ

1

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