Автоматическая настройка CreatedBy и UpdatedBy в объектах JPA

StackOverflow https://stackoverflow.com/questions/1865355

  •  16-09-2019
  •  | 
  •  

Вопрос

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

CreatedBy - идентификатор пользователя лица, создавшего объект.CreatedOn - дата создания объекта UpdatedBy - идентификатор пользователя, который в последний раз обновлял объект updatedOn - дата последнего обновления объекта

У меня мое приложение работает так, что CreatedOn и updatedOn устанавливаются автоматически при сохранении объекта, но я не уверен, как я могу заполнить поля CreatedBy и UpdatedBy без необходимости проходить через ИДЕНТИФИКАТОР текущего зарегистрированного пользователя весь путь от класса контроллера до DAOS.

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

Спасибо!

Это было полезно?

Решение 2

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

Другие советы

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

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

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

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

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

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

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


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

  //getters and setters

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top