Настройка createdBy и updatedBy в объектах JPA автоматически
Я работаю над JPA (реализация гибернации), Spring и Stripes web app. У меня есть несколько сущностей JPA, которые имеют следующие общие поля для целей аудита и запроса:
createdBy-идентификатор пользователя, создавшего объект. createdOn - дата создания сущности updatedBy-идентификатор пользователя, который в последний раз обновлял объект поиск - дата последнего обновления сущности
У меня есть приложение, работающее так, что createdOn и updatedOn устанавливаются автоматически, когда сущность сохраняется, но я не уверен, как я могу получить поля createdBy и updatedBy, заполненные без необходимости проходить через идентификатор текущего пользователя от класса контроллера до DAOs.
есть ли у кого-нибудь предложения о том, как я могу это сделать, не передавая userIDs повсюду? Обратите внимание, что текущий идентификатор пользователя хранится в объекте HttpSession на данный момент, поэтому мой бэкэнд должен каким-то образом получить доступ к этому данные...
спасибо!
3 ответов
вы можете взглянуть на один из этих подходов, чтобы передать идентификатор пользователя в качестве контекста на бизнес-уровне:
- как передать контекст между слоями с ThreadLocal и EJB 3
- Как Передать Контекст Стандартным Способом-Без ThreadLocal
(сообщения могут быть актуальными, даже если вы не используете EJB. Второй пост имеет смысл, однако, только если вы используете Spring с JTA)
Я лично обескуражьте этот подход, так как я воспринимаю с ним две проблемы:
- тестируемость: контекстные данные должны быть настроены в тесте
- контракт: контекстные данные участвуют в контракте на использование сущности, но не ясно видны в интерфейсе.
передача userID "повсюду" может показаться большой работой, но я думаю, что это чище.
установить дату и идентификатор пользователя автоматически при создании объекта или обновления может использовать EntityListener или обратные вызовы жизненного цикла (возможно вы уже это делаете). Надеюсь, это поможет...
Я бы создал такой класс:
@MappedSuperclass
public abstract class AuditableDomainClass {
private long createdBy;
private long updatedBy;
//getters and setters
ваши классы сущностей, которые имеют описанное Вами требование, просто расширят этот класс, вы установите переменные в слое, который вам нужен (например, контроллер), и вам не нужно беспокоиться об этом на всем пути вниз в DAOs.