Генерация столбцов Create_Date и Update_Date с использованием Hibernate - PullRequest
2 голосов
/ 21 апреля 2010

Я использую прямой Hibernate 3.0 без аннотаций.

При сохранении или обновлении объектов домена я бы хотел, чтобы Hibernate автоматически генерировал поля CREATE_DT и UPDATE_DT, а не триггеры базы данных.

Каковы наилучшие методы для достижения этой цели?

Фон в том, что у меня есть граф объектов, переданный от клиента, который содержит несколько объектов. Некоторые из них будут вставлены, а другие обновлены. Я мог бы установить даты на клиенте, но это было бы плохой идеей. Установка даты на сервере означает, что мне придется пролистать график и обнаружить изменения.

Мне кажется, что у Hibernate есть возможность сделать это, но это не бросается на меня.

Ответы [ 3 ]

1 голос
/ 21 апреля 2010

Hibernate способ сделать это без использования триггеров будет использовать архитектуру событий Hibernate и зарегистрировать слушатели для PreInsertEvent, PreUpdateEvent или SaveOrUpdateEvent (посмотрите на org.hibernate.event пакет для полного списка), чтобы установить и обновить даты создания / обновления.

Другой вариант - использовать перехватчик , либо Session -области, либо SessionFactory -области, чтобы установить create и даты обновления в onSave(...) и дата обновления в onFlushDirty(...).

Может быть, посмотрите на этот предыдущий ответ для других вариантов.

0 голосов
/ 17 мая 2010

Я проверяю ответ Паскаля как правильный ответ, так как он указал мне непосредственно на пункт в документации, которая содержит подробности и пример кода. Но для читателя я добавляю больше деталей здесь.

Я попробовал как события гибернации, так и перехватчики, и обнаружил, что перехватчик работал лучше в моей ситуации. Это было относительно легко осуществить.

Спасибо за помощь!

Ниже приведен код перехватчика:

public class AuditInterceptor extends EmptyInterceptor {

    private Log log = LogFactory.getLog(this.getClass());

    private int updates;
    private int creates;

    @Override
    public boolean onSave(Object entity, Serializable id, Object[] state,
            String[] propertyNames, Type[] types) {
        if (entity instanceof AuditableVO) {
            creates++;
            // Find the create date and change it
            for (int i=0; i < propertyNames.length; i++) {
                if (propertyNames[i].equals("createDate")) {
                    state[i] = new Date();
                    return true;
                }
            }
        }
        return false;
    }
    @Override
    public boolean onFlushDirty(Object entity, Serializable id,
            Object[] currentState, Object[] previousState,
            String[] propertyNames, Type[] types) {
        if (entity instanceof AuditableVO) {
            updates++;
            // Find the update date and change it
            for (int i=0; i < propertyNames.length; i++) {
                if (propertyNames[i].equals("updateDate")) {
                    currentState[i] = new Date();
                    return true;
                }
            }           
        }
        return false;
    }
    @Override
    public void afterTransactionCompletion(Transaction tx) {
        if (tx.wasCommitted()) {
            log.info("Creations: " + creates + ", Updates: " + updates);
        }
        creates = 0;
        updates = 0; 

        super.afterTransactionCompletion(tx);
    }
}
0 голосов
/ 21 апреля 2010

Самый простой способ, на мой взгляд, добиться этого - это поместить эти поля в качестве свойств в ваш объектный класс и установить их конфиденциально через ваш конструктор. Когда значение свойства будет изменено, установите для DateUpdated (например) значение DateTime.Now (или что бы то ни было в Java).

Как только ваша сущность сохраняется, она автоматически сохраняет эти даты и сохраняет их в вашей базовой базе данных.

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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...