Подтвердить что ты не робот

Как проверить JPA без Hibernate Envers

Мне нужно сделать модуль аудита для моего веб-приложения Java. Я использую 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?

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

4b9b3361

Ответ 1

EclipseLink имеет полную поддержку отслеживания истории.

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

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

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

Ответ 2

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

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

Есть ли у кого-нибудь опыт с этим или подобным решением?

Ответ 3

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