@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 не зависит от домена
  • Вопрос задан
  • 595 просмотров
Решения вопроса 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 не редактируемыми.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽