Как прочитать атрибут из связанного объекта, используя JsonManagedReference

1

У меня есть два объекта: UserEntity и ApartmentEntity, которые связаны OneToMany (у одного пользователя может быть много квартир). У меня возникла проблема с сериализацией его в JSON с бесконечной рекурсией (я решил это с помощью @JsonManagedReference и @JsonBackReference: Бесконечная рекурсия с проблемой Jackson JSON и Hibernate JPA), но теперь я не могу прочитать user_id из таблицы квартир (мне нужно знать, какие пользователь владеет текущей квартирой).

ApartmentEntity:

@Entity
@Table(name = "users")
@Scope("session")
public class UserEntity {

  @Id
  @Column(name = "user_id")
  @GeneratedValue
  public int user_id;

  //other fields ...

  @JsonManagedReference
  @OneToMany(mappedBy="user", cascade = { CascadeType.MERGE }, fetch=FetchType.EAGER)
  private List<ApartmentEntity> apartments;

  //getters setters ...
}

ApartmentEntity

@Entity
@Table(name = "apartments")
public class ApartmentEntity {

  @Id
  @Column(name = "id")
  @GeneratedValue
  private int id;

  // ...

  @JsonBackReference
  @ManyToOne
  @JoinColumn(name="user_id")
  private UserEntity user;

  //getters, setters ...
}

И теперь возвращенный JSON не имеет user_id внутри атрибутов квартиры.

Как решить эту проблему? Как читать какой-либо атрибут, используя аннотации @Json. Я застрял здесь.

Теги:
spring
hibernate
jpa

1 ответ

0

JsonManagedReference, JsonBackReference работают в одну сторону. Таким образом, UserEntity JSON содержит ApartmentEntities, но ApartmentEntity не будет содержать UserEntity.

Джексон обеспечивает лучший механизм, чтобы избежать круговых ссылок:

http://wiki.fasterxml.com/JacksonFeatureObjectIdentity

Поскольку у вас уже есть поле id с использованием JPA, я бы рекомендовал использовать PropertyGenerator для классов сущностей:

@JsonIdentityInfo (generator = ObjectIdGenerators.PropertyGenerator.class, property = "user_id", scope = UserEntity.class)

@JsonIdentityInfo (generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = ApartmentEntity.class)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню