Я новичок в Spring Data REST, и после успешного создания некоторых объектов я столкнулся с проблемой. У меня есть таблица shopping_list, которая содержит некоторые shopping_list_products, shopping_list_product имеет отношение к shopping_list, все это в базе данных mysql. Проблема в том, что когда я пытаюсь создать список покупок с некоторыми продуктами внутри, создается список, но не продукты. В ответе я вижу товары с id "null".
Это классы (избегая геттеров / сеттеров):
Список покупок:
@Entity
@Table(name = "shopping_list")
public class ShoppingList {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private Date creationDate;
@RestResource(exported=false)
@OneToMany(mappedBy = "shoppingList")
private List<ShoppingListProduct> shoppingListProducts;
ShoppingListProduct:
@Entity
@Table(name = "shopping_list_products")
public class ShoppingListProduct {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private boolean checked;
@ManyToOne(fetch=FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "shopping_list_id")
private ShoppingList shoppingList;
И вот что происходит, когда я пытался вставить какие-то товары с помощью почтальона:
Я вставляю это:
{
"name" : "name",
"creationDate" : "2018-12-12",
"shoppingListProducts" : [
{
"name" : "product 1",
"checked" : false
},
{
"name" : "product 2",
"checked" : true
}
]
}
И я получаю ответ 201 (создан) со следующим результатом:
{
"name": "name",
"creationDate": "2018-12-12",
"shoppingListProducts": [
{
"name": "product 1",
"checked": false,
"resourceId": null
},
{
"name": "product 2",
"checked": true,
"resourceId": null
}
],
"resourceId": 60,
"_links": {
"self": {
"href": "http://localhost:8080/shoppingLists/60"
},
"shoppingList": {
"href": "http://localhost:8080/shoppingLists/60"
}
}
}
Как видите, resourceId, созданный для продуктов в shoppingList, имеет значение null, и если я перейду в базу данных, продукты не будут созданы.
Я не могу найти, в чем проблема, поэтому буду очень признателен за вашу помощь.
Спасибо!
Контроллеры @Frighi являются расширениями CrudRepository и не имеют специальных методов.
У вас должен быть какой-то контроллер для доступа к конечным точкам
@Frighi, как я уже сказал, они являются расширениями CrudRepository из Spring Data. Этим вы расширяете все действия и конечные точки CRUD. Ничего кастомного не добавлено.
Так что я не знаю, я никогда не использовал это, и я не могу найти пример весеннего приложения без контроллера.
как насчет публикации вашей отладки? как то, что журнал поставщиков JPA говорит о вызванном SQL ...
@billyFrost, вот что говорит отладка, вроде не вызываются продукты запроса. - вставить в список покупок (дата создания, имя) значения (?,?) - параметр привязки [1] как [ДАТА] - [2018-12-12] - параметр привязки [2] как [VARCHAR] - [Имя списка покупок]
поскольку у вас нет каскадного набора для отношения 1-N (shoppingListProducts), почему они должны быть? Мы не видим, какие вызовы API JPA выполняются ...




Попробуйте изменить аннотации для id на:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Я полагаю, вы хотите добавить его в ShoppingListProduct, изменить его и вернуть то же самое. Кажется, они добавлены, но resourceId равен нулю и не сохраняется.
Что ж, благодаря @BillyFrost я добавил каскад на @OneToMany, и после этого я получил ошибку 500, в которой говорилось, что shopping_list_id не может быть нулевым. Итак, я отредактировал средство настройки shoppingListProducts, установив текущий список покупок, например:
public void setShoppingListProducts(List<ShoppingListProduct> shoppingListProducts) {
for (ShoppingListProduct sp : shoppingListProducts) {
sp.setShoppingList(this);
}
this.shoppingListProducts = shoppingListProducts;
}
И вот это сработало!
Спасибо большое за вашу помощь!
Пожалуйста, покажите и контроллер