Я определил следующий класс и как по умолчанию 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 и я мог бы обновить его вручную, то значения были корректно сохранены в базе данных.
Как насчет того, чтобы сделать UpperCase() перед сохранением или обновлением, например, в объекте setUser, вы можете просто сделать user = user. uppercase() – Rika
Я мог бы это сделать, но мне пришлось бы изменить много кода в моем проекте, у меня более 300 объектов, и для этого потребуется слишком много работы. –
Сохраняется ли работа сохранения, если вы просто добавили аннотацию PreUpdate? – Rika