Автоматическая установка ByBy и updatedBy в объектах JPA

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

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

У меня приложение работает так, что createOn и updatedOn устанавливаются автоматически, когда сущность сохраняется, но я не уверен, как можно заполнить поля createBy и updatedBy без необходимости проходить через идентификатор текущего вошедшего в систему пользователя. от класса контроллера до DAO.

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

Спасибо!

 yihtserns07 февр. 2010 г., 14:52
Вы не хотите устанавливать созданные и обновленные в контроллере, прежде чем сохранить его?
 WelcomeTo16 дек. 2013 г., 21:47
Какой механизм вы использовали для проверки, если объект грязный, поэтому вы устанавливаетеupdateBy/At поля? Я задал связанный вопрос, пожалуйста, проверьте его:stackoverflow.com/questions/20620406/...

Ответы на вопрос(3)


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

  //getters and setters

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

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

ра пользователя в качестве контекста на бизнес-уровне:

Как передать контекст между слоями с помощью ThreadLocal и EJB 3Как передать контекст стандартным способом - без ThreadLocal

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

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

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

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

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

Решение Вопроса

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

Ваш ответ на вопрос