Я нашел метод в ответе ниже очень полезным для прозрачного управления созданной и обновленной отметкой времени для сущностей:
жесткая настройка времени сгенерированного автоматически с аннотациями JPA в спящем режиме
Мне интересно, есть ли что-то подобное для записи пользователя создания и обновления для сущности?
@PreUpdate
@PrePersist
public void updateAudit() {
lastModifiedDate = new Date();
lastModifiedUser = ??;
if (dateCreated==null) {
dateCreated = new Date();
userCreated = ??;
}
}
Хотя новый Date()
в этом примере отображает текущее время, у меня возникают проблемы с поиском места, в котором можно сохранить идентификатор пользователя (во время входа в систему), доступного из аннотированного метода @PrePersist на объекте.
Внедрение @LoggedInUser
методом @Produces
было бы идеальным, но мои сущности создаются с помощью new()
, а не путем инъекции, поэтому не управляются.
Я довольно новичок в этом, поэтому я надеюсь, что упускаю что-то очевидное. Благодаря.
[править] Ответ ниже от prunge привел к коду (сокращенно)
@MappedSuperclass
public abstract class BaseEntity implements Serializable, Comparable<BaseEntity> {
@Version
private Timestamp updatedTimestamp;
private static ThreadLocal<Long> threadCurrentUserId = new ThreadLocal<Long>();
/* Called from entry point like servlet
*/
public static void setLoggedInUser(BaseEntity user) {
if (user!=null) threadCurrentUserId.set(user.getId());
}
@PrePersist
@PreUpdate
protected void onCreateOrUpdate() {
//Note we don't have to update updatedTimestamp since the @Version annotation does it for us
if(createdTimestamp==null) createdTimestamp = new Timestamp(new Date().getTime());;
lastUpdatedByUserId = threadCurrentUserId.get();
if(createdByUserId==null) createdByUserId = lastUpdatedByUserId;
}