Двунаправленный JPA OneToMany Cascade.ALL не удаляет каскадные записи, как ожидалось - PullRequest
0 голосов
/ 30 мая 2019

Я работаю над приложением, которое состоит из двух моделей предметной области: Student и Meal. В этом приложении еда может быть создана через форму, и студент может быть назначен поваром для этой еды.

Кратность выглядит следующим образом:

-В обеде может быть 1 ученик в качестве повара (ManyToOne)

- Студент может быть назначен на несколько приемов пищи, которые он будет готовить (OneToMany)

Теперь у меня есть две проблемы: во-первых, когда я удаляю ученика из базы данных, я хочу, чтобы блюда, которые соответствуют удаленному ученику, также автоматически удалялись, я использую CascadeType = ALL на стороне OneToMany в ученике, но соответствующие блюда не будут удалены.

Мой код выглядит следующим образом:

Meal.Java

@Entity
public class Meal {

  @Id
  @GeneratedValue
  private Long id;

  @JoinColumn(name = "student_id")
  @ManyToOne(fetch = FetchType.LAZY)
  private Student mealCook;

  private String mealName;

  private int mealPrice;

база данных выглядит следующим образом: https://ibb.co/RH3MGrQ

Student.Java

@Entity
public class Student {

@Id
@GeneratedValue
private Long id;

private String studentName;

@OneToMany(
        mappedBy = "mealCook",
        cascade = CascadeType.ALL,
        orphanRemoval = true
)
private List<Meal> meals = new ArrayList<>();

база данных выглядит следующим образом: https://ibb.co/vjSST6g

MealController.Java

@Controller
@RequestMapping("/m")
public class MealController {

    @Autowired
    private MealService mealService;

    private final MealRepository mealRepository;
    private final StudentRepository studentRepository;

    public MealController(MealRepository mealRepository, StudentRepository studentRepository){
        this.mealRepository = mealRepository;
        this.studentRepository = studentRepository;
    }
    @GetMapping(params = "form")
    public String createForm(@ModelAttribute Meal meal , Model model) {
        Iterable<Student> students = this.studentRepository.findAll();
        model.addAttribute("students" , students);
        return "meals/form";
    }

    @PostMapping
    public ModelAndView create(@Valid Meal meal,  BindingResult result,
                               RedirectAttributes redirect) {
        if (result.hasErrors()) {
            return new ModelAndView("meals/form", "formErrors", result.getAllErrors());
        }
        meal = this.mealRepository.save(meal);

        redirect.addFlashAttribute("globalMessage", "meals.view.success");
        return new ModelAndView("redirect:/m/{meal.id}", "meal.id", meal.getId());
    }

Моя вторая проблема - я хочу отобразить все блюда, которые готовит конкретный студент, но в моей базе данных не будут отображаться идентификаторы еды, которые связаны со студентом. Я добавил скриншот для того, чего я пытаюсь достичь: https://ibb.co/2s6rMqt

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

Надеюсь, я проиллюстрировал свою проблему достаточно ясно, заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...