我已經定義了以下類的默認實體監聽器,所以每次我打電話時堅持()或合併()方法,該代碼將自動執行:字段值不被修改的更新前的回調
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,我可以更新手動,那麼值正確保存在數據庫中。
如何在保存或更新之前執行UpperCase(),就像在實體setUser中執行user = user操作一樣。大寫() – Rika 2014-09-25 19:06:33
我本來可以做到這一點,但是我必須更改我的項目中的很多代碼,我有300多個實體,並且需要做太多的工作才能完成。 – 2014-09-25 19:15:20
如果您只是將PreUpdate註釋放在那裏,保存工作是否正常? – Rika 2014-09-25 19:51:34