Hibernate опустить JsonManagedReference для сохранения - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь сохранить один объект, который имеет внутренний список.Мне пришлось аннотировать сущность Item с помощью @JsonManagedReference и ItemProperty с @JsonBackReference, чтобы избежать бесконечного цикла - разорвать цикл.

И для получения элементов со свойствами элемента это хорошо.Проблема заключается в том, что когда я пытаюсь сохранить новый элемент со списком свойств элемента, сохраняется только элемент без каких-либо свойств объекта.Кто-нибудь знает, почему это?Есть ли в нем аннотации @ JsonBackReference / ManagedReference?

КОД:

import com.fasterxml.jackson.annotation.JsonManagedReference;
import javax.persistence.*;
import java.util.List;
import java.util.Objects;

@Entity
@Table(name = "item")
public class Item {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;

@Enumerated(EnumType.STRING)
@Column(name = "type")
private ItemType itemType;

@OneToMany(mappedBy = "item")
// @JsonManagedReference is the forward part of reference which gets serialized normally.
@JsonManagedReference
private List<ItemProperty> itemProperties;

public Item() {

}

public Item(ItemType itemType, List<ItemProperty> itemProperties) {
    this.itemType = itemType;
    this.itemProperties = itemProperties;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public ItemType getItemType() {
    return itemType;
}

public void setItemType(ItemType itemType) {
    this.itemType = itemType;
}

public List<ItemProperty> getItemProperties() {
    return itemProperties;
}

public void setItemProperties(List<ItemProperty> itemProperties) {
    this.itemProperties = itemProperties;
}

@Override
public String toString() {
    return "Item{" +
            "id=" + id +
            ", itemType=" + itemType +
            ", itemProperties=" + itemProperties +
            '}';
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Item item = (Item) o;
    return id == item.id &&
            itemType == item.itemType &&
            Objects.equals(itemProperties, item.itemProperties);
}

@Override
public int hashCode() {
    return Objects.hash(id, itemType, itemProperties);
}
}

ПУНКТ СОБСТВЕННОСТИ:

import com.fasterxml.jackson.annotation.JsonBackReference;

import javax.persistence.*;
import java.util.Objects;

@Entity
@Table(name = "item_properties")
public class ItemProperty {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "item_id")
@JsonBackReference
private Item item;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "item_property_definition_id")
private ItemPropertyDefinition itemPropertyDefinition;

@Column(name = "value")
private String value;

public ItemProperty(){}

public ItemProperty(Item item, ItemPropertyDefinition itemPropertyDefinition, String value) {
    this.item = item;
    this.itemPropertyDefinition = itemPropertyDefinition;
    this.value = value;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public Item getItem() {
    return item;
}

public void setItem(Item item) {
    this.item = item;
}

public ItemPropertyDefinition getItemPropertyDefinition() {
    return itemPropertyDefinition;
}

public void setItemPropertyDefinition(ItemPropertyDefinition itemPropertyDefinition) {
    this.itemPropertyDefinition = itemPropertyDefinition;
}

public String getValue() {
    return value;
}

public void setValue(String value) {
    this.value = value;
}

@Override
public String toString() {
    return "ItemProperty{" +
            "id=" + id +
            ", item=" + item +
            ", itemPropertyDefinition=" + itemPropertyDefinition +
            ", value='" + value + '\'' +
            '}';
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    ItemProperty that = (ItemProperty) o;
    return id == that.id &&
            Objects.equals(item, that.item) &&
            Objects.equals(itemPropertyDefinition, that.itemPropertyDefinition) &&
            Objects.equals(value, that.value);
}

@Override
public int hashCode() {
    return Objects.hash(id, item, itemPropertyDefinition, value);
}

}

В РЕСТОРАНЕ ОТДЫХА:

   @PostMapping("/items")
Item addItem(@RequestBody Item item) {
    item.setId(0);
    return this.itemService.addItem(item);
}

Заранее спасибо за подсказки.

Хорошего дня и удачного кодирования!

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Ответ C.Weber был правильным, но также отсутствовала аннотация @Transactional.

0 голосов
/ 01 февраля 2019

Вы не объявили каскадный флаг в @OneToMany.По умолчанию ни одна операция над объектом не попадает в каскадный список ItemProperty.Итак, взгляните на перечисление CascadeType и установите операции, которые вы хотите каскадировать, в список itemsproperty.Для получения дополнительной информации о CascadeTypes смотрите здесь .

Пример:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "item", orphanRemoval = true)
// @JsonManagedReference is the forward part of reference which gets serialized normally.
@JsonManagedReference
private List<ItemProperty> itemProperties;

Если вам интересно, для чего хорош orphanRemoval, взгляните на этот вопрос.

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