Не добавляются значения в базу данных
Хочу добавить меню в ресторан, но ничего не добавляется, кроме адреса и названия ресторана добавляю через постман вот так
{
"restaurantName":"Mama Roma",
"menu":[
{"foodName":"Pizza",
"foodDescription":"Good",
"foodPrice":10},
{"foodName":"Pizza",
"foodDescription":"Good",
"foodPrice":10},
{"foodName":"Pizza",
"foodDescription":"Good",
"foodPrice":10}
],
"address":{
"country":"Latvia",
"city":"Riga",
"street":"Lacplesa"
}
}
так же пыталась добавить через сервис меню, создавала метод
public void addFoodItem(FoodMenu foodMenu){
foodMenuRepository.save(foodMenu);
}
но добавлялось все кроме айди ресторана, подскажите пожалуйста, как мне добавить меню в ресторан
Restaurant
@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "Restaurant")
public class Restaurant {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "RESTAURANT_ID")
private Long id;
private String restaurantName;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "restaurant")
private List<FoodMenu> menu;
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "ADDRESS_ID")
private Address address;
}
FoodMenu
@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "FoodMenu")
public class FoodMenu {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "FOOD_MENU_ID")
private Long id;
private String foodName;
private String foodDescription;
private BigDecimal foodPrice;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "RESTAURANT_ID")
private Restaurant restaurant;
}
Service
@Service
@Transactional
public class RestaurantService {
@Autowired
private RestaurantRepository restaurantRepository;
public void saveRestaurant(Restaurant restaurant){
restaurantRepository.save(restaurant);
}
public List<Restaurant> allRestaurants(){
return restaurantRepository.findAll();
}
}
Controller
@RestController
public class RestaurantController {
@Autowired
private RestaurantService restaurantService;
@PostMapping("/create")
public void createUploadRestaurant(@RequestBody Restaurant restaurant){
restaurantService.saveRestaurant(restaurant);
}
@GetMapping("/showAllRestaurants")
public List<Restaurant> showRestaurants(){
return restaurantService.allRestaurants();
}
}
Ответы (1 шт):
Для добавления меню в классе Restaurant необходимо создать и использовать метод, в котором будет устанавливаться связь между экземплярами меню и ресторана (аналогично и для удаления). Также лучше проинициализировать список заранее, чтобы не проверять затем на null:
public class Restaurant {
// ...
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "restaurant")
private List<FoodMenu> menu = new ArrayList<>();
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "ADDRESS_ID")
private Address address;
public void addMenu(FoodMenu menuItem) {
menu.add(menuItem);
menuItem.setRestaurant(this);
}
public void removeMenu(FoodMenu menuItem) {
menu.remove(menuItem);
menuItem.setRestaurant(null);
}
}
Или же перед сохранением в базе экземпляра Restaurant принудительно установите связь между рестораном и его меню -- тогда при сохранении ресторана каскадно сохранятся и его пункты меню:
public class RestaurantService {
@Autowired
private RestaurantRepository restaurantRepository;
public void saveRestaurant(Restaurant restaurant) {
// if (null != restaurant.getMenu()) { // проверка нужна для версии без инициализации
for (FoodMenu item : restaurant.getMenu()) {
item.setRestaurant(restaurant);
}
// }
restaurantRepository.save(restaurant);
}
//...
}
Ещё один вариант -- обеспечить связь между Restaurant и FoodMenu во время десериализации, но для этого потребуется переопределить сеттер для соответствующего поля:
- "отключить" сеттер, сгенерированный ломбок-аннотацией
- написать свой сеттер (подобно коду, показанному выше для сервиса)
@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "Restaurant")
public class Restaurant {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "RESTAURANT_ID")
private Long id;
private String restaurantName;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "restaurant")
@Setter(AccessLevel.NONE)
private List<FoodMenu> menu;
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "ADDRESS_ID")
private Address address;
public void setMenu(List<FoodMenu> menu) {
this.menu = menu;
if (this.menu != null) {
this.menu.forEach(m -> m.setRestaurant(this));
}
}
}
