Сохранение данных в таблице гибернации jpa дает null для столбцов соединения

#java #sql-server #spring-boot #hibernate #spring-data-jpa

#java #sql-сервер #весенняя загрузка #гибернация #spring-data-jpa

Вопрос:

У меня есть две таблицы, которые связаны друг с другом, таблица «пользователь» и «адрес»:

 @Entity
@Table(name = "user")
@Data
public class User{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @NotNull
    @Column(unique = true)
    private String user_name;

    @Column
    private String description;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
    protected Set<Address> addresses= new HashSet<>();
}
  

В то время как в другой таблице:

 @Entity
@Table(name = "address")
@Data
public class Address{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

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

    private String description;
}
  

Я выполнил post-запрос для создания нового пользователя с некоторыми адресами:

 @PostMapping ("/user/create")
public ResponseEntity post(@RequestBody User user) {
    userService.saveNewUser(user);
     // return
}
  

В запросе post я отправил этот json:

 {
 
  "user_name": "example",
  "description": "this is a  user description",
  "addresses": [
    {
      "description": "this is a address 1"
    },
    {
      "description": "this is a address 2"
    }
  ]
}
  

Когда я вставляю данные, я получаю таблицу «address», в которой «user_id» равно нулю, данные вставляются, но отношений там нет?
Что я здесь делаю не так? Пожалуйста, помогите!

Обновление: допустим, у меня есть этот метод saveNewUser в службе, как вызвать update Address?

 public Oject saveNewUser(User user ) {
       // 
        return jpaRepository.save(user);
    }
  

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

1. Ваш json не соответствует конкретному адресу модели пользователя

2. Вам необходимо установить поле пользователя во всех экземплярах адресов для синхронизации с обеих сторон. Нравится user.getAddresses().forEach(e -> e.setUser(user));

Ответ №1:

Вы должны поддерживать все отношения вручную. Гибернация не делает этого за вас. Итак, вам нужно установить пользователя для каждого адреса.

 public Oject saveNewUser(User user ) {
   user.getAddresses().forEach(address -> address.setUser(user));
   return jpaRepository.save(user);
}
  

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

1. Я добавил этот метод, но как он должен работать, поскольку я нигде его не вызываю? @В.Ладынев

2. @xarqt вы должны вызывать его для каждого адреса

3. Я не знаю точно, где я должен это назвать? В контроллере или где?

4. @xarqt на уровне обслуживания

5. Я действительно в замешательстве, не могли бы вы предоставить мне небольшой псевдокод о том, как вы предлагаете это сделать? Я добавил обновление по своему вопросу, в котором я добавил метод обслуживания