Как вызвать объект onLoad() с помощью гибернации Envers?

Я добавляю Hibernate Envers в свой проект Grails 3. Я заметил, что для одной из моих сущностей, которая имеет событие onLoad(), событие onLoad() никогда не вызывается для сущностей ревизии Envers.

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

Случай использования:

Я работаю над службой RESTful, используя представления Grails 3 JSON. В одном из моих доменных классов есть столбец дискриминатора, который также должен отображаться в выводе JSON, чтобы потребитель мог определить, к какому типу он относится. По этой причине доменная сущность определяет метод onLoad(), который заполняет временное свойство, соответствующее типу дискриминатора:

class MyChildDomainClass extends MyBaseDomainClass {
    void onLoad() {
        valueType = ValueType.STRING
    }

    static mapping = {
        discriminator value: ValueType.STRING
    }
}

Это прекрасно работает для обычных экземпляров домена, но когда я ищу ревизию объекта из AuditQueryCreator Энверса, аудиторский запрос не вызывает метод onLoad().

Кажется, я мог бы просмотреть результаты и вручную вызвать onLoad(), но я надеялся, что есть лучший способ исправить это.

Заранее спасибо!


person RMorrisey    schedule 13.01.2020    source источник


Ответы (2)


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

Я не очень хорошо разбираюсь в Grails, но они очень похожи на типичные аннотированные события жизненного цикла событий JPA, и это, вероятно, методы, которые GORM (во многом как разработчик JPA) ищет и вызывает на основе жизненного цикла объекта.

Важным выводом здесь является то, что объекты, возвращаемые Envers Query API, не являются сущностями. Эти объекты не управляются поставщиком постоянства, поэтому важно четко различать это различие, поскольку оно влияет на множество ожиданий поведения постоянства, таких как отсоединенные сущности, события жизненного цикла сущностей и т. д.

Если есть некоторые обратные вызовы после инициализации или другие обратные вызовы жизненного цикла, которые вам нужно запускать при извлечении результатов из AuditQuery, код пользователя должен делать эти различия и вызывать эти методы по мере необходимости.

person Naros    schedule 17.01.2020
comment
Спасибо за ответ. Есть ли у Envers какие-то крючки жизненного цикла? Я не мог найти это в документах - person RMorrisey; 19.01.2020
comment
Нет, на данный момент нет, но это не значит, что мы не можем добавить что-то подобное, если действительно возникнет такая необходимость. - person Naros; 21.01.2020

вы можете попробовать изменить тип возвращаемого значения на "def", как указано в документе здесь

class Person {
   String name
   Date dateCreated
   Date lastUpdated
   def onLoad() {
      log.debug "Loading ${id}"
   }
}
person Gorille    schedule 15.01.2020