@Nulltiton

Как добавить записи в две таблицы в Hibernate?

Есть метод, в котором добавляется пользователь и информация о нем (это две разные таблицы, которые связаны друг с другом):
public void saveUser(UserCompositeDTO userCompositeDTO) {
        var userInfo = new UserInfo();
        var user = new User();

        user.setAuthorities((Set<Role>) userCompositeDTO.getAuthorities());
        user.setEmail(userCompositeDTO.getEmail());
        user.setPassword(userCompositeDTO.getPassword());
        user.setUsername(userCompositeDTO.getUsername());
        user.setEnabled(true);
        user.setOrganization(userCompositeDTO.getOrganization());

        userRepository.save(user);
        User currentUser = userRepository.findUserByUsername(user.getUsername());

        userInfo.setFirstName(userCompositeDTO.getFirstName());
        userInfo.setMiddleName(userCompositeDTO.getMiddleName());
        userInfo.setLastName(userCompositeDTO.getLastName());
        userInfo.setBirthDate(userCompositeDTO.getBirthDate());
        userInfo.setPhoneNumber(userCompositeDTO.getPhoneNumber());
        userInfo.setUser(currentUser);

        userInfoRepository.save(userInfo);
    }

Связь в User:
@OneToOne(mappedBy = "user", cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER)
    private UserInfo userInfo;

Связь в UserInfo:
@OneToOne(optional = false)
    @JoinColumn(name = "user_id", insertable = false, updatable = false, unique = true)
    private User user;


При сохранении пользователя информация в таблицу User кладется верно, а в UserInfo кладется все, кроме поля user_id. Намеренно стал искать уже сохраненного пользователя по юзернейму, чтобы положить его в UserInfo, но даже это не помогло. Пожалуйста, подскажите, в чем я ошибся?
  • Вопрос задан
  • 56 просмотров
Пригласить эксперта
Ответы на вопрос 2
uraltux
@uraltux
java разработчик
при таком виде связи вы забыли скорее всего сеттер. JPA сам не умеет это делать

public void setUserInfo(UserInfo userInfo) {
        if (userInfo == null) {
            if (this.userInfo != null) {
                this.userInfo.setUser(null);
            }
        }
        else {
            userInfo.setUser(this);
        }
        this.userInfo = userInfo;
    }
Ответ написан
@Nulltiton Автор вопроса
Решил проблему костылем в виде сохранения сначала UserInfo, а после докидывая в него пользователя при помощи кастового метода.
Код:
@Transactional
    public void saveCompositeUser(UserCompositeDTO userCompositeDTO) {
        var userInfo = new UserInfo();
        userInfo.setFirstName(userCompositeDTO.getFirstName())
                .setMiddleName(userCompositeDTO.getMiddleName())
                .setLastName(userCompositeDTO.getLastName())
                .setBirthDate(userCompositeDTO.getBirthDate())
                .setPhoneNumber(userCompositeDTO.getPhoneNumber());

        UserInfo currentUserInfo = userInfoRepository.save(userInfo);

        User user = new User();
        user.setAuthorities(userCompositeDTO.getAuthorities())
                .setEmail(userCompositeDTO.getEmail())
                .setPassword(userCompositeDTO.getPassword())
                .setUsername(userCompositeDTO.getUsername())
                .setEnabled(true)
                .setOrganization(userCompositeDTO.getOrganization())
                .setUserInfo(currentUserInfo);

        User currentUser = userRepository.save(user);
        userInfoRepository.addUserId(currentUserInfo.getId(), currentUser);
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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