Автоматическая настройка CreatedBy и UpdatedBy в объектах JPA
Вопрос
Я работаю над веб-приложением JPA (реализация гибернации), Spring и Stripes.У меня есть несколько объектов JPA, которые имеют следующие общие поля как для целей аудита, так и для целей запроса:
CreatedBy - идентификатор пользователя лица, создавшего объект.CreatedOn - дата создания объекта UpdatedBy - идентификатор пользователя, который в последний раз обновлял объект updatedOn - дата последнего обновления объекта
У меня мое приложение работает так, что CreatedOn и updatedOn устанавливаются автоматически при сохранении объекта, но я не уверен, как я могу заполнить поля CreatedBy и UpdatedBy без необходимости проходить через ИДЕНТИФИКАТОР текущего зарегистрированного пользователя весь путь от класса контроллера до DAOS.
Есть ли у кого-нибудь какие-либо предложения о том, как я мог бы это сделать, не передавая идентификаторы пользователей повсюду?Обратите внимание, что текущий идентификатор пользователя на данный момент хранится в объекте HttpSession, поэтому моему бэкэнду необходимо каким-то образом получить доступ к этим данным...
Спасибо!
Решение 2
Я решил, что ThreadLocal, вероятно, самый чистый способ сделать это в моем приложении.
Другие советы
Вы можете ознакомиться с одним из этих подходов для передачи идентификатора пользователя в качестве контекста на бизнес-уровне:
- Как Передавать Контекст между Слоями С помощью ThreadLocal И EJB 3
- Как Передать контекст Стандартным способом - без ThreadLocal
(Сообщения могут оставаться актуальными, даже если вы не используете EJB.Однако второй пост имеет смысл, только если вы используете Spring с JTA)
Лично я не одобряю такой подход, поскольку вижу в нем две проблемы:
- Тестируемость:контекстные данные необходимо будет настроить в тесте
- Контракт:контекстные данные участвуют в контракте на использование объекта, но не являются четко видимыми в интерфейсе.
Передача идентификатора пользователя "повсюду" может показаться сложной работой, но я думаю, что это чище.
Чтобы автоматически устанавливать дату и идентификатор пользователя при создании или обновлении объекта, вы можете использовать Обратные вызовы EntityListener или жизненного цикла (возможно, вы уже делаете это).Надеюсь, это поможет...
Я бы создал такой класс, как этот:
@MappedSuperclass
public abstract class AuditableDomainClass {
private long createdBy;
private long updatedBy;
//getters and setters
Ваши классы сущностей, которые имеют описанное вами требование, просто расширили бы этот класс, вы бы установили свои переменные на нужном вам уровне (например, контроллер), и вам не нужно беспокоиться об этом вплоть до DAOS.