#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. Я действительно в замешательстве, не могли бы вы предоставить мне небольшой псевдокод о том, как вы предлагаете это сделать? Я добавил обновление по своему вопросу, в котором я добавил метод обслуживания