Сохранять вложенные сущности (один ко многим) с двунаправленным отношением - PullRequest
0 голосов
/ 23 апреля 2020

Я создаю веб-приложение Spring Boot, которое должно получить документ JSON по HTTP, проанализировать его в соответствующем классе сущностей и сохранить объект. JSON является представлением экземпляра Recipe , и один рецепт может иметь несколько Step объектов, связанных с ним.

Recipe. java

@Entity
public class Recipe {

    @Id
    @GeneratedValue
    private Long id;

    @NotNull
    private String name;

    @OneToMany(mappedBy = "recipe", cascade = CascadeType.ALL)
    private Set<Step> steps;

    // Additional attributes, constructors, getters and setters omitted
}

Шаг. java

@Entity
public class Step {

    @Id
    @GeneratedValue
    private Long id;

    @NotNull
    private String name;

    @ManyToOne
    @JoinColumn(name = "RECIPE_ID")
    private Recipe recipe;

    // Additional attributes, constructors, getters and setters omitted
}

При отправке следующего JSON документ для приложения, однако внешний ключ, ссылающийся на RECIPE_ID в объекте шага, равен null, таким образом, нет никакой связи между рецептом и его шагами.

{
    "name": "Test recipe",
    "description": "Test description",
    "type": "Test",
    "cookingTime": 45,
    "preparationTime": 30,
    "thumbnail": "",
    "steps": [
        {
            "number": 1,
            "name": "First step",
            "content": "Test content",
            "image": ""
        },
        {
            "number": 2,
            "name": "Second step",
            "content": "Test content",
            "image": ""
        }
    ]
}

Не должен ли вложенный шаг объекты также сохраняются, так как CascadeType.ALL было указано? Кроме того, я использую RestController для обработки запроса и JpaRepository класс для персистентности.

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Вы можете добавить аннотацию @JsonBackReference на стороне @ManyToOne и аннотацию @JsonManagedReference на стороне @OneToMany.

@Entity
public class Recipe {

    @Id
    @GeneratedValue
    private Long id;

    @NotNull
    private String name;

    @OneToMany(mappedBy = "recipe", cascade = CascadeType.ALL)
    @JsonManagedReference("recipe_steps")
    private Set<Step> steps;

    // Additional attributes, constructors, getters and setters omitted
}


@Entity
public class Step {

    @Id
    @GeneratedValue
    private Long id;

    @NotNull
    private String name;

    @ManyToOne
    @JoinColumn(name = "RECIPE_ID")
    @JsonBackReference("recipe_steps")
    private Recipe recipe;

    // Additional attributes, constructors, getters and setters omitted
}
1 голос
/ 23 апреля 2020

В вашем контроллере вам нужно будет сделать что-то вроде этого.

for (Step step : recipe.getSteps()) {
    step.setRecipe(recipe);
}

В основном вам не хватает обратной ссылки в Step object, равном null при публикации.

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