Почему сериализованный объект (Dish) не содержит ссылку на родительский объект (Restaurant)?
Реализую REST API приложение, в котором есть сущность Restaurant и сущность Dish. (relationship one-to-many/many-to-one).
Restaurant:
@Entity
@Table(name = "restaurants", uniqueConstraints = {@UniqueConstraint(columnNames = {"name"},
name = "restaurants_unique_name_idx")})
public class Restaurant extends NamedEntity {
@Column(name = "address", nullable = false)
@Size(max = 50)
@NotBlank
private String address;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "restaurant")
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonManagedReference
private List<Dish> menu;
public Restaurant() {
}
public Restaurant(Integer id, String name, String address) {
super(id, name);
this.address = address;
}
Dish:
@Entity
@Table(name = "dishes", uniqueConstraints = {@UniqueConstraint(columnNames =
{"restaurant_id", "registered", "name"}, name = "dish_unique_name_idx")})
public class Dish extends NamedEntity {
@Column(name = "price")
@Range(min = 50, max = 1000)
private Integer price;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "restaurant_id", nullable = false)
@JsonBackReference
private Restaurant restaurant;
@Column(name = "registered", nullable = false, columnDefinition = "timestamp default now()", updatable = false)
@NotNull
private LocalDate registered;
public Dish() {
}
public Dish(Integer price, Restaurant restaurant, LocalDate registered) {
this.price = price;
this.restaurant = restaurant;
this.registered = registered;
}
public Dish(Integer id, String name, Integer price, Restaurant restaurant, LocalDate
registered) {
super(id, name);
this.price = price;
this.restaurant = restaurant;
this.registered = registered;
}
В rest контроллере есть метод , который позволяет получить ресторан с едой
@GetMapping(value = "/{id}/with-dishes")
public Restaurant getWithDishes(@PathVariable int id) {
return repository.getWithDishes(id);
}
Для этого приходится использовать аннотации @jsonmanagedreference and @jsonbackreference чтобы избежать infinite recursion. И при запросе на получение ресторана с едой все отображается корректно.
"id": 1,
"name": "White Rabbit",
"address": "Смоленская площадь, 3",
"menu": [
{
"id": 1,
"name": "Pasta Carbonara",
"price": 450,
"registered": "2021-12-01"
},
{
"id": 2,
"name": "Oysters",
"price": 700,
"registered": "2021-12-01"
},
{
"id": 3,
"name": "Fried eggs",
"price": 200,
"registered": "2021-12-01"
}
]
}
Но при запросе еды я не могу добиться того, чтобы были данные по ресторану.
Метод в контроллере:
//получение еды по id
@GetMapping(value = "/{id}")
public Dish get(@PathVariable int id) {
return checkNotFoundWithId(dishRepository.getById(id), id);
}
возвращает
{
"id": 2,
"name": "Oysters",
"price": 700,
"registered": "2021-12-01"
}
Есть ли способ это реализовать помимо того, что изменить тип LAZY на EAGER?