Как проводить аудит JPA без Hibernate Envers - PullRequest
12 голосов
/ 13 октября 2011

Мне нужно сделать модуль аудита для моего Java Web App. Я использую EclipseLink, а не Hibernate (не могу использовать Envers). Я много искал способ получить SQL или JPQL, который выполняет JPA, поэтому я мог записать что-то вроде этого:

System.out.println("User " + user + " from " + ip_address + " executed " + jpa_statement + " at " + new Date());

На самом деле, я сохраню эту информацию в таблице базы данных истории. Так что я могу легко получить эту информацию в любое время. Поэтому мне не хватает параметров " SHOW SQL ". Мне действительно нужна строка SQL, поэтому я могу манипулировать ею в своем исходном коде.

Я нашел в спецификации JPA функцию EntityListener и подумал, что это идеальное место для размещения моего кода регистрации. Например, метод postUpdate может регистрировать время обновления объекта. Но моя проблема в том, что я не могу получить SQL, который был выполнен.

Вот пример того, что я имею в виду:

public class AuditListener {    
  @PostUpdate
  public void postUpdate(Object object) {
    User user = (User)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user");
    String ip_address =  (User)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("ip_address");
    String jpa_statement = object.getSQL();
    System.out.println("User " + user + " from " + ip_address + " executed " + jpa_statement + " at " + new Date());
  }

}

Но "object.getSQL ()" не существует. Итак, как я могу получить оператор SQL?

Если бы кто-нибудь мог указать мне правильное направление, я был бы признателен!

Ответы [ 3 ]

13 голосов
/ 13 октября 2011

EclipseLink полностью поддерживает отслеживание истории.

См, http://wiki.eclipse.org/EclipseLink/Examples/JPA/History

События JPA не содержат того, что было изменено, только объект.

EclipseLink также поддерживает DesriptorEvents (см. DescriptorEventListener), который также определяет postUpdate, но включает ObjectChangeSet, который описывает изменения, у вас также есть UpdateObjectQuery, который содержит SQL и DatabaseRecord.

6 голосов
/ 04 июня 2013

Envers для аудита - это здорово, но я думаю, что может быть лучшее решение для аудита. В Энверсе есть несколько недостатки: Две таблицы БД для каждой таблицы. Но вторая таблица используется редко. Для нашего крупного корпоративного проекта, где более 600 таблиц, это проблема. Envers является решением только для изменений в БД. Когда мне нужно решить аудит для других компонентов приложения, мне нужно другое решение для аудита. Аудит коллекций не идеален. Когда меняется схема базы данных, я тоже должен менять таблицы аудита. Я могу потерять некоторые данные аудита или у меня много работы по обновлению старых данных аудита до новой схемы. Сохранение данных аудита в той же базе данных занимает много времени и места.

Я начинаю работать над небольшой библиотекой аудита, где информация хранится в базе данных MongoDB: Используется одна коллекция для всех спящих объектов. Хранится каждое значение объекта. Аудит проводится в другой ветке. Коллекции (список идентификаторов) тоже хранятся. Та же база данных MongoDB используется для других журналов приложений.

Кто-нибудь имеет опыт работы с этим или подобным решением?

3 голосов
/ 22 сентября 2017

Я обычно рекомендую сделать сервер приложений для аудита, у многих есть возможность аудита.Например, недавно я сделал проект, в котором данные аудита хранились в отдельной базе данных на отдельном сервере приложений.Мы используем функцию модуля аудита Glassfish.Отделил заботу об аудите от приложения все вместе.

...