2015-11-30 4 views
1

Я использую Camel и JPA для сохранения объектов в DB Postgres. В каждой сущности у меня есть поле под названием «история», которое содержит все старые значения данного объекта. Я ищу способ заполнить это поле автоматически перед каждой операцией обновления. Surfing the web, я нашел перехватчики JPA, но я видел, что они используются для аудита/ведения журнала. Я ошибаюсь? Каков наилучший способ сделать это?JPA/Hibernate: как автоматически обновлять поля при обновлении сущности

+0

Как вы планируете хранить изменения в одном столбце? – WeMakeSoftware

+0

@Funtik это поле json, обработано по умолчанию postgres – dylaniato

+0

Я думаю, вы также можете использовать триггер db. –

ответ

1

Перехватчики JPA/Hibernate (которые зависят от версии, которую вы используете) являются одним из способов сделать это. Аудит/ведение журнала аналогично тому, что вы хотите сделать, т. Е. Автоматически обновлять некоторые свойства столбца /, когда сам объект обновляется (любое свойство). Просто обратите внимание, что запросы ручного обновления обходят эти перехватчики, поэтому их следует избегать.

Как вы используете эти перехватчики, зависит от того, как вы хотите реализовать эту функцию истории. Если вы делаете это, создавая представление строки/байта и сохраняя его в столбце, оно должно работать. Если вы планируете создать другой объект и т. Д., Вам, возможно, придется собирать изменения/старые значения в перехватчике, и при успешной фиксации вы сохраняете собранные значения. AFAIK невозможно (по крайней мере, не просто) создать новый объект при вызове перехватчиков.

+0

Спасибо за ваш ответ. Для «запросов ручного обновления» вы подразумеваете запрос, выполняемый непосредственно в БД (не используя приложение)? В этом случае я могу избавиться от этого. – dylaniato

+0

@dylaniato Я имею в виду любой запрос (JPQL/HQL или SQL), непосредственно вызываемый в диспетчере сущностей. Чтобы перехватчики работали, вы должны позволить Hibernate определить изменения и инициировать запросы, по крайней мере, это то, что мы узнали из наших тестов/реализаций. – Thomas

0
@Entity 
@Table(name = "entities")  
public class Entity { 
    ... 

    private Date created; 
    private Date updated; 

    @PrePersist 
    protected void onCreate() { 
    created = new Date(); 
    } 

    @PreUpdate 
    protected void onUpdate() { 
    updated = new Date(); 
    } 
} 
0

Вы можете использовать @EntityListeners и предоставить сущности Приёмник класс к нему, и вы также можете повторно использовать это всякий раз, когда вы хотите

В вашей сущности Слушатель класса, вы можете предоставить методы обратного вызова с @PrePersit, @PostPersist, @PreUpdate, @PostUpdate, @PreDelete, @PostDelete аннотациями. Эти методы будут автоматически вызваны для их соответствующих действий.

Для получения более подробной информации вы можете прочитать Spring Data JPA Auditing: Saving CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate automatically.

Смежные вопросы