Внешний ключ не сохраняется в дочерней таблице в связи «Один ко многим»

#java #spring #hibernate #spring-boot

#java #spring #переход в спящий режим #весенняя загрузка

Вопрос:

Я разрабатываю приложение REST API с использованием spring boot и столкнулся с сопоставлением «Один ко многим» при использовании свойства mappedBy. У меня есть класс User и класс Usermeata, у пользователя может быть более одной usermeta.

Хотя программа успешно сохраняет внешний ключ при использовании JoinColumn, я хочу знать, какую ошибку я совершаю при использовании mappedby.

Вот мой код:

Класс сущности пользователя:

 
@Entity
@Table(name="User")
public class User {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long userId;

    @Column(unique=true)
    private String username;

    @Column(unique=true)
    private String emailId; 

    private String password;
    private String firstName;
    private String lastName;
    private String phoneNo;
    @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy="user")
//  @JoinColumn(name="user_id")
    private List<UserMeta> userMetaList=new ArrayList();




    public List<UserMeta> getUserMetaList() {
        return userMetaList;
    }

    public void setUserMetaList(List<UserMeta> userMetaList) {
        this.userMetaList = userMetaList;
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmailId() {
        return emailId;
    }

    public void setEmailId(String emailId) {
        this.emailId = emailId;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getPhoneNo() {
        return phoneNo;
    }

    public void setPhoneNo(String phoneNo) {
        this.phoneNo = phoneNo;
    }


}

  

Класс UserMeta:

 
@Entity
public class UserMeta {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long userMetaId;

    @ManyToOne
    @JoinColumn(name="user_id")
    private User user;

    private String _key;

    private String _value;

    public Long getUserMetaId() {
        return userMetaId;
    }

    public void setUserMetaId(Long userMetaId) {
        this.userMetaId = userMetaId;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String get_key() {
        return _key;
    }

    public void set_key(String _key) {
        this._key = _key;
    }

    public String get_value() {
        return _value;
    }

    public void set_value(String _value) {
        this._value = _value;
    }

}

  

UserService.class

 @Service
public class UserService {

    @Autowired
    private UserRepository  userRepository;

    public User getUser(Long  userId) {
        return userRepository.getOne(userId);
    }

    public List<User> getAllUser() {
        return userRepository.findAll();
    }

    public User addUser(User user) {
        return userRepository.save(user);
    }

    public void removeUser(User user) {
        userRepository.delete(user);
    }

    public void updateUser(User user) {
        userRepository.save(user);
    }
}


  

ОПУБЛИКОВАТЬ запрос:

 {
    "username":"myusername",
    "emailId":"myemailid@gmail.com1",
    "password":"2323@123",
    "firstName":"myfname",
    "lastName":"mlname",
    "phoneNo":"000000",
    "userMetaList":[
        {
            "_key":"api_key",
            "_value":"api_key_value"
        },
        {
            "_key":"prop1",
            "_value":"val1"
        }
        ]
}
  

Теперь таблицы созданы и обновлены значениями, однако столбец user_id в таблице usermeta всегда равен нулю..

Комментарии:

1. Опубликуйте код, который вы используете для их сохранения.

2. Этот вопрос задавался уже миллион раз. Столбец user_id равен null, потому что user поле ваших объектов UserMeta равно null. Все очень просто.

3. Я много раз просматривал Google и stackoverflow, к сожалению, ничего, казалось, не работало (возможно, я реализовал неправильно, поэтому моим последним средством было опубликовать вопрос самостоятельно.) . Как мне назначить user полю user в Usermeta?

4. Как мне назначить пользователя полю user в Usermeta : путем вызова userMeta.setuser(theOwningUser) . почему приложение работает нормально при использовании @JoinTable вместо mappedBy : потому что в этом случае у вас есть однонаправленная ассоциация, где у UserMeta даже нет пользовательского поля, и где сторона-владелец ассоциации — User.userMetaList, а не UserMeta.user. Прочитайте документацию. Там все объяснено.

5. Нет. Это просто … хорошее именование: метод добавляет UserMeta, поэтому вы называете метод addUserMeta . Если бы метод запустил двигатель автомобиля, вы бы назвали его startCarEngine .