У меня есть два объекта: 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. Я застрял здесь.
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)