Почему сериализованный объект (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?


Ответы (0 шт):