Как отправить объект с моделью, включая его дочерний объект - PullRequest
0 голосов
/ 13 июля 2020

Я хочу добавить новый объект продукта с его категорией. Объект продукта успешно отправлен, но его категория (внутри продукта) равна нулю. Что за ошибка, которую эта категория не может отправить. Как я могу это исправить? Код внутри @Controller.

@GetMapping("/loadForm")
public String addNewProduct(Model model){
    Product theProduct = new Product();
    List<Category> categories = (List<Category>) categoryService.findAll();
    model.addAttribute("categories", categories);
    model.addAttribute("product", theProduct);
    return "addProduct";
}
@PostMapping(value="/add")
public String addProduct(@ModelAttribute("product") Product product) {
    System.out.println("Checking");
    productService.insert(product);
    return "product";
}

Код внутри HTML файла:

<form th:action="@{/products/add}" th:object="${product}" method="POST">

    <input type="hidden" value="100" th:field="*{productId}"/><br>

        <input type="text" th:field="*{barcode}"
           class="form-control mb-4 col-10" placeholder="barcode"><br><br>

    <input type="text" th:field="*{createdUser}"
           class="form-control mb-4 col-10" placeholder="created User"><br><br>

    <input type="text" th:field="*{lastModifiedUser}"
           class="form-control mb-4 col-10" placeholder="last Modified User"><br><br>

    <input type="text" th:field="*{productIsService}"
           class="form-control mb-4 col-10" placeholder="product Is Service"><br><br>

    <input type="text" th:field="*{productName}"
           class="form-control mb-4 col-10" placeholder="product name"><br><br>

    <input type="text" th:field="*{productbuyingPrice}"
           class="form-control mb-4 col-10" placeholder="product buying Price"><br><br>

    <input type="text" th:field="*{productsellingPrice}"
           class="form-control mb-4 col-10" placeholder="product selling Price"><br><br>

    <input type="text" th:field="*{version}"
           class="form-control mb-4 col-10" placeholder="version"><br><br>

    <select th:field="*{category}"
            class="form-control mb-4 col-10" placeholder="Select category">
        <option th:each="tempCategory : ${categories}" th:value="${tempCategory}" th:text="${tempCategory.categoryName}"></option>
    </select>

    <button type="submit" class="btn btn-info col-4">Save</button>

</form>

И отношение между товаром и категорией - много к одному. Код в классе продукции

@ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE,
            CascadeType.PERSIST,CascadeType.REFRESH})
    @JoinColumn(name="category_id")
    private Category category;

Код в категории класса

@JsonIgnore
    @OneToMany(mappedBy="category")
    private List<Stock> stocks;

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Я просто добавляю cascade и fetch в идентификатор категории. Я заменяю это:

@JsonIgnore
    @OneToMany(mappedBy="category")
    private List<Stock> stocks;

на это:

@OneToMany(fetch = FetchType.LAZY,
            mappedBy="category",
            cascade = {CascadeType.DETACH, CascadeType.MERGE,
                    CascadeType.PERSIST, CascadeType.REFRESH})
    public List<Product> products;

В дочернем объекте отсутствовал Cascade.

0 голосов
/ 13 июля 2020

В вашем сценарии для одного продукта будет несколько категорий. Отображение должно иметь вид oneToMany .

В классе продукта:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="category_id") 
Set<Category> categories;

В классе категории:

@JoinColumn(name = "category_id")
@ManyToOne(cascade = CascadeType.ALL)
private Product product;
...