Я пытаюсь сохранить один объект, который имеет внутренний список.Мне пришлось аннотировать сущность 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);
}
Заранее спасибо за подсказки.
Хорошего дня и удачного кодирования!