Я собираюсь разработать свой API для отдыха. Интересно, как я могу обрабатывать такие объекты, как один ниже:
@Entity
public class Foo {
@ManyToMany
private Set<Bar> barSet;
@OneToMany
private Set<Zzz> zzzSet;
}
Как вы видите, объект, который я хочу предоставить своему остальному API, состоит из других коллекций сущностей. Я использую Spring 4 и Jackson. Можно ли вернуть объекты, подобные приведенному выше, или мне нужно создавать классы только с примитивными значениями?
1 ответ
Да, это возможно, но вам нужно решить 2 проблемы:
1) при сериализации Джексон вызовет геттер Foo.getBarSet()
. Это приведет к сбою, потому что по умолчанию Hibernate возвращает ленивые коллекции для отношений @OneToMany
и @ManyToMany
.
Если они вам не нужны, пометьте их @JsonIgnore
:
@Entity
public class Foo {
@JsonIgnore
@ManyToMany
private Set<Bar> barSet;
@JsonIgnore
@OneToMany
private Set<Zzz> zzzSet;
}
Если они вам нужны, вы должны указать спящему режиму, чтобы они загружались. Например, вы можете аннотировать @ManyToMany
и @OneToMany
с помощью fetch = FetchType.EAGER
(кстати, это не единственное решение):
@Entity
public class Foo {
@ManyToMany(fetch = FetchType.EAGER)
private Set<Bar> barSet;
@OneToMany(fetch = FetchType.EAGER)
private Set<Zzz> zzzSet;
}
2) Это также может вызвать бесконечные циклы:
- Сериализация вызовов Foo
Foo.getBarSet()
- Сериализация вызовов бара
Bar.getFoo()
- Сериализация вызовов Foo
Foo.getBarSet()
- [...]
Это можно сделать с помощью @JsonManagedReference
и @JsonBackReference
:
@Entity
public class Foo {
@JsonManagedReference
@OneToMany
private Set<Zzz> zzzSet;
А с другой стороны:
@Entity
public class Zzz {
@JsonBackReference
private Foo parent;
}
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.