Я собираюсь разработать свой API для отдыха. Интересно, как я могу обрабатывать такие объекты, как один ниже:

@Entity
public class Foo {
@ManyToMany
private Set<Bar> barSet;
@OneToMany
private Set<Zzz> zzzSet;
}

Как вы видите, объект, который я хочу предоставить своему остальному API, состоит из других коллекций сущностей. Я использую Spring 4 и Jackson. Можно ли вернуть объекты, подобные приведенному выше, или мне нужно создавать классы только с примитивными значениями?

0
Jaqen K'uba 22 Фев 2016 в 17:19
Вы можете легко вернуть такие объекты, как foo, но тогда вам нужно игнорировать ссылку на foo в своем классе bar, иначе Джексон выйдет из строя.
 – 
kai
22 Фев 2016 в 17:21
Большой. Не могли бы вы рассказать мне, как этого добиться?
 – 
Jaqen K'uba
22 Фев 2016 в 17:28
Используйте аннотацию @JsonIgnore и аннотируйте ссылку на foo в классе bar. Это предотвратит появление круговой зависимости.
 – 
kai
22 Фев 2016 в 17:30

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;
}
3
Arnaud Denoyelle 22 Фев 2016 в 18:24