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

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

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

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

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

Спасибо!

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

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

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

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

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

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

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

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

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


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

  //getters and setters

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

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

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

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