Задать вопрос
@SeApps
Я художник, я так вижу

Как работать с @CreatedBy в Spring?

День добрый (хотя уже ночь)
Использую Auditing. В домене стоит:

@ManyToOne
@JoinColumn
@CreatedBy
private User user;


Объект User валидный. Но не persist-нутый, вследствие чего при попытке записать в базу вываливается простыня, мотивированная тем, что object references an unsaved transient instance.
Я её понимаю, но тем не менее, где я должен save the transient instance (и как, неужели UserRepo подгружать), когда он записывается как раз при @PrePersist?
Как решить эту проблему?

P. S В интернетах пишут про CascadeType.ALL, но это не то, ведь у меня User не зависит от домена
  • Вопрос задан
  • 752 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
@SeApps Автор вопроса
Я художник, я так вижу
Я нашел решение.
Дело в том, что у меня getCurrentUser() возвращал новосозданный объект User, а надо было вытягивать его из базы с помощью репо (что бы объект сразу был persisted, а не detached).
Мой getCurrentUser() сейчас:
@Override
    public Optional<User> getCurrentAuditor() {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        UserDetails userDetails = (UserDetails) auth.getPrincipal();
        return this.userRepository.findByLogin(userDetails.getUsername());
    }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Dugayoyo
Тебе нужно написать компонент, который вернёт тебе текущего залогиненного юзера из контекста.
Для этого нужно создать новый компонент, который реализует AuditorAware интерфейс.
Примерно так:

@Component
public class UserAuditorAware implements AuditorAware<User> {
    @Override
    public Optional<User> getCurrentAuditor() {
        SecurityContext context = SecurityContextHolder.getContext();
        // из контекста получаете userId или его имя, смотря что там храните.
        Long userId = //;
        return Optional.of(new User(userId));
    }
}


также, не забудь сделать колонки для createBy или createAt не редактируемыми.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы