Почему jpa не добавляет данные к значению внешнего ключа - PullRequest
0 голосов
/ 04 августа 2020

У меня есть таблица пользователей, в которой содержатся сведения о пользователе. У меня также есть таблица полномочий, в которой есть роль пользователя. Таблица пользователей и полномочий имеет сопоставление "один ко многим". Когда я пытаюсь сохранить детали с помощью Jpa, столбец внешнего ключа пуст, в это поле не вставляются данные. У меня есть форма, в которой я указываю роль пользователя вместе с другими деталями.

package com.example.StarsProject.Model;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;

@Entity
@Table
@Getter
@Setter
public class Authorities {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String role;
    @ManyToOne(cascade = CascadeType.PERSIST,fetch=FetchType.EAGER)
    @JoinColumn(name = "users_id", referencedColumnName = "id")
    private Users users;

    public Authorities(String role){
        this.role = role;
    }

}

package com.example.StarsProject.Model;

import com.example.StarsProject.DTO.UserDTO;
import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table
@Getter
@Setter
public class Users {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column(name = "first_name")
    private String firstname;
    @Column(name = "last_name")
    private String lastname;
    @Column(unique = true)
    private String email;
    private String password;
    @OneToMany(fetch = FetchType.EAGER,targetEntity = Authorities.class,mappedBy = "users", cascade = CascadeType.PERSIST)
    private  Set<Authorities> authorities;

    public Users(UserDTO userDTO) {
        this.email = userDTO.getEmail();
        this.firstname = userDTO.getFirstname();
        this.lastname = userDTO.getLastname();
        this.password = userDTO.getPassword();
//        Authorities authorities = new Authorities();
//        authorities.setRole(userDTO.getRole());
//        Set<Authorities> set = new HashSet<>();
//        set.add(authorities);
        this.authorities = new HashSet<Authorities>(Arrays.asList(new Authorities(userDTO.getRole())));
    }

}

package com.example.StarsProject.Service;

import com.example.StarsProject.DTO.UserDTO;
import com.example.StarsProject.Model.Users;
import com.example.StarsProject.Repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserDetailsServiceImpl implements UserDetailsServiceInterface{

    @Autowired
    UserRepository userRepository;

    @Override
    public void storeUserDetails(UserDTO userDTO) {
        Users users = new Users(userDTO);
        userRepository.save(users);
    }
}


Когда я пытаюсь сохранить данные пользователя, он не вставляет никакого значения в столбец внешнего ключа. Может ли кто-нибудь сказать мне, что я делаю не так.

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Проблема заключалась в том, что я использовал mappedBy = "users", это говорит о том, что дочерний класс AkA Authorities класс отвечает за заполнение деталей внешнего ключа. Когда я удалил mappedBy в классе пользователей и добавил @JoinColumn (name = "user_id"). Все сработало.

Jpa может ввести данные внешнего ключа, вам просто нужно сказать, что вы хотите, чтобы jpa обработала его.

0 голосов
/ 04 августа 2020

Необходимо вручную указать поле users в Authorities. Hibernate не заполнит его за вас.

...