Spring Data JPA Self Join с Nullable внешним ключом

У меня проблема с Spring Data JPA. Я хочу создать категорию, у которой есть родительская категория с той же таблицей. Некоторым категориям не обязательно иметь родительскую категорию, поэтому родительская категория может быть нулевой. но когда я это сделаю и сохраню, он показал ошибку, как показано ниже:

org.hibernate.TransientPropertyValueException: object references an unsaved 
transient instance - save the transient instance before flushing : 
com.ltech.solutions.ecom.models.category.Category.parent -> 
com.ltech.solutions.ecom.models.category.Category

Вот моя модель:

@Entity
@Table(name = "tb_category")
public class Category extends BaseEntity {

    @Column(name = "name", nullable = false)
    private String name;

    @JsonIgnore
    @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id", referencedColumnName = "id")
    private Category parent;

    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
    @JsonProperty(value = "sub_categories")
    private Set<Category> subCategories;

    @Column(name = "is_visible", insertable = false, columnDefinition = 
    "BOOLEAN DEFAULT TRUE")
    @JsonProperty(value = "is_visible")
    private Boolean isVisible;

    @Column(name = "is_enable", insertable = false, columnDefinition = "BOOLEAN 
    DEFAULT TRUE")
    @JsonProperty(value = "is_enable")
    private Boolean isEnable;

    @Column(name = "desc_attribute")
    private String descAttribute;
 }
  • При сохранении объекта я использую метод сохранения CRUDRepsoitory.

Вот мой взгляд:

<form th:object = "${createCategoryForm}" th:action = "@{/category/save}" 
method = "post">
        <fieldset>
            <legend>Create Category</legend>
            <div class = "form-group">
                <label>Name</label>
                <input class = "form-control" th:field = "*{name}" />
            </div>
            <div class = "form-group">
                <label>Code</label>
                <input class = "form-control" th:field = "*{code}" />
            </div>
            <div class = "form-group">
                <label>Description (English)</label>
                <input class = "form-control" th:field = "*{descEn}" />
            </div>
            <div class = "form-group">
                <label>Description (Khmer)</label>
                <input class = "form-control" th:field = "*{descKh}" />
            </div>
            <div class = "form-group">
                <label>Attribute</label>cs
                <input class = "form-control" th:field = "*{descAttribute}" />
            </div>
            <div class = "form-group">
                <label>Parent of</label>
                <select class = "form-control" th:field = "*{parent.id}">
                    <option value = "">None</option>
                    <option th:each = "parent : ${parentCategories}" th:value = "${parent.id}" th:text = "${parent.name}"></option>
                </select>
            </div>
            <input type = "submit" />
        </fieldset>
    </form>

Похоже, что свойство parent объекта Category, которое вы пытаетесь сохранить, не равно нулю и также не является управляемым объектом. если объект Category, который вы пытаетесь сохранить, не имеет родительского Category, убедитесь, что свойство parent вашего объекта равно нулю.

chubock 16.07.2018 15:49

@HassanMusavi Вау, вот и все. Моей категории parent нет. Ты спас меня, мужик. Большое спасибо.

Leang 16.07.2018 15:58

Я использую ModelMapper для преобразования формы в модель категории. и поэтому он не нулевой.

Leang 16.07.2018 15:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
4
3
315
0

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