Отношение @ManyToOne вставляет нулевые объекты в Spring Data REST

Я новичок в 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 31.07.2018 21:58

Контроллеры @Frighi являются расширениями CrudRepository и не имеют специальных методов.

Mellao 31.07.2018 22:09

У вас должен быть какой-то контроллер для доступа к конечным точкам

Frighi 31.07.2018 22:14

@Frighi, как я уже сказал, они являются расширениями CrudRepository из Spring Data. Этим вы расширяете все действия и конечные точки CRUD. Ничего кастомного не добавлено.

Mellao 01.08.2018 08:11

Так что я не знаю, я никогда не использовал это, и я не могу найти пример весеннего приложения без контроллера.

Frighi 01.08.2018 08:19

как насчет публикации вашей отладки? как то, что журнал поставщиков JPA говорит о вызванном SQL ...

user3973283 01.08.2018 12:20

@billyFrost, вот что говорит отладка, вроде не вызываются продукты запроса. - вставить в список покупок (дата создания, имя) значения (?,?) - параметр привязки [1] как [ДАТА] - [2018-12-12] - параметр привязки [2] как [VARCHAR] - [Имя списка покупок]

Mellao 01.08.2018 12:29

поскольку у вас нет каскадного набора для отношения 1-N (shoppingListProducts), почему они должны быть? Мы не видим, какие вызовы API JPA выполняются ...

user3973283 01.08.2018 12:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
8
103
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте изменить аннотации для id на:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)

Я полагаю, вы хотите добавить его в ShoppingListProduct, изменить его и вернуть то же самое. Кажется, они добавлены, но resourceId равен нулю и не сохраняется.

Mellao 31.07.2018 22:12
Ответ принят как подходящий

Что ж, благодаря @BillyFrost я добавил каскад на @OneToMany, и после этого я получил ошибку 500, в которой говорилось, что shopping_list_id не может быть нулевым. Итак, я отредактировал средство настройки shoppingListProducts, установив текущий список покупок, например:

public void setShoppingListProducts(List<ShoppingListProduct> shoppingListProducts) {

    for (ShoppingListProduct sp : shoppingListProducts) {
            sp.setShoppingList(this);   
    }

        this.shoppingListProducts = shoppingListProducts;
}

И вот это сработало!

Спасибо большое за вашу помощь!

Другие вопросы по теме