Как запустить сущность onLoad (), используя спящий режим Envers? - PullRequest
0 голосов
/ 13 января 2020

Я добавляю 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
    }
}

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

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

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

Ответы [ 2 ]

1 голос
/ 17 января 2020

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

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

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

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

0 голосов
/ 16 января 2020

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

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