Spring Boot: не может POST во многих отношениях - PullRequest
1 голос
/ 24 февраля 2020

У меня есть две сущности Meal и Mealplan, которые находятся в @ManyToMany Relation. Каждый план питания может иметь разные виды еды, и каждая еда может быть в нескольких планах.

@Entity
public class Meal {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private String name;
    private BigDecimal price;
    private String type;

@ManyToMany(mappedBy = "mealsPerWeek")
private List<Mealplan> mealplan;

и

@Entity
public class Mealplan {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private int week;

    @ManyToMany
    private List<Meal> mealsPerWeek;

Поскольку я добавил отношение ManyToMany, я не могу добавить еду с помощью @ Размещение карты в API.

MealController

@RestController
@RequestMapping("/meal")
@CrossOrigin(origins = "*", allowedHeaders = "*")
public class MealController {

    @PostMapping
    public void addMeal(@RequestBody Meal meal) {
        mealRepository.save(meal);
    }

Класс MealRepository расширяет JPARepository.

Всякий раз, когда я хочу опубликовать что-либо в моем например,

{
    "id": 10,
    "name": "Test",
    "price": 3.50,
    "type": "with Meat"
}

появляется следующая ошибка: "could not execute statement; SQL [n/a]; constraint [PRIMARY]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement"

Добавление через INSERT INTO работает как обычно.

Ответы [ 3 ]

0 голосов
/ 24 февраля 2020

Согласно вашему коду, поскольку вы использовали 'mappedBy' в сущности Meal, следовательно, это сопоставленная сущность, и, следовательно, MealPlan становится сущностью-владельцем, т.е. она отвечает за поддержание связей.

Вы также нужно создать еще одну таблицу, давайте назовем MealMapping для хранения сопоставлений Meal и MealPlan, имеющих поля, такие как food_id и foodplan_id.

Теперь вам нужно определить @JoinTable в сущности владельца.

@Entity
public class Mealplan {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private int week;

@ManyToMany
@JoinTable(name="MealMapping", joinColumns={@JoinColumn(referencedColumnName="ID")}, 
inverseJoinColumns={@JoinColumn(referencedColumnName="ID")})  
private List<Meal> mealsPerWeek;
}

Надеюсь, это поможет.

Кроме того, он работает по запросу INSERT, поскольку вы определили отношение многие ко многим в режиме гибернации, а не в таблицах базы данных. Однако ограничения применяются только тогда, когда вы попробуй вставить используя hibernate.

0 голосов
/ 26 февраля 2020

Я решил проблему для себя. Я заметил, что @GeneratedValue(strategy = GenerationType.AUTO) не устанавливает в поле идентификатора значение «Автоинкремент». Я установил его на @GeneratedValue(strategy = GenerationType.IDENTITY) и вставляю новые данные без использования идентификатора, подобного этому (как упомянул @Ravi Sharma):

{
    "name": "Test",
    "price": 3.50,
    "type": "with Meat"
}
0 голосов
/ 24 февраля 2020

Согласно вашему сопоставлению сущностей, поле Id определяется как автоматически сгенерированное. В вашем запросе Json идентификатор передается как 10. Вы пытаетесь вставить или обновить ?. Вы можете попробовать запрос ниже JSON и посмотреть, работает ли вставка.

{
    "name": "Test",
    "price": 3.50,
    "type": "with Meat",
    "mealplan": []

}
...