Настройка createdBy и updatedBy в объектах JPA автоматически

Я работаю над JPA (реализация гибернации), Spring и Stripes web app. У меня есть несколько сущностей JPA, которые имеют следующие общие поля для целей аудита и запроса:

createdBy-идентификатор пользователя, создавшего объект. createdOn - дата создания сущности updatedBy-идентификатор пользователя, который в последний раз обновлял объект поиск - дата последнего обновления сущности

У меня есть приложение, работающее так, что createdOn и updatedOn устанавливаются автоматически, когда сущность сохраняется, но я не уверен, как я могу получить поля createdBy и updatedBy, заполненные без необходимости проходить через идентификатор текущего пользователя от класса контроллера до DAOs.

есть ли у кого-нибудь предложения о том, как я могу это сделать, не передавая userIDs повсюду? Обратите внимание, что текущий идентификатор пользователя хранится в объекте HttpSession на данный момент, поэтому мой бэкэнд должен каким-то образом получить доступ к этому данные...

спасибо!

3 ответов


вы можете взглянуть на один из этих подходов, чтобы передать идентификатор пользователя в качестве контекста на бизнес-уровне:

(сообщения могут быть актуальными, даже если вы не используете EJB. Второй пост имеет смысл, однако, только если вы используете Spring с JTA)

Я лично обескуражьте этот подход, так как я воспринимаю с ним две проблемы:

  • тестируемость: контекстные данные должны быть настроены в тесте
  • контракт: контекстные данные участвуют в контракте на использование сущности, но не ясно видны в интерфейсе.

передача userID "повсюду" может показаться большой работой, но я думаю, что это чище.

установить дату и идентификатор пользователя автоматически при создании объекта или обновления может использовать EntityListener или обратные вызовы жизненного цикла (возможно вы уже это делаете). Надеюсь, это поможет...


Я решил, что ThreadLocal-вероятно, самый чистый способ сделать это в моем приложении.


Я бы создал такой класс:


@MappedSuperclass
public abstract class AuditableDomainClass {
  private long createdBy;
  private long updatedBy;

  //getters and setters

ваши классы сущностей, которые имеют описанное Вами требование, просто расширят этот класс, вы установите переменные в слое, который вам нужен (например, контроллер), и вам не нужно беспокоиться об этом на всем пути вниз в DAOs.