Hibernate spring数据jba一对多双向递归循环-更改json忽略取决于父实体

Hibernate spring数据jba一对多双向递归循环-更改json忽略取决于父实体,spring,hibernate,jackson,spring-data-jpa,spring-data,Spring,Hibernate,Jackson,Spring Data Jpa,Spring Data,我有一对多的关系。乡村酒店。国家可以有M家酒店,酒店只有一个国家 HotelEntity @Entity @Table(name = "hotel") public class HotelEntity { ... @ManyToOne(cascade= {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH}, fetch = FetchTy

我有一对多的关系。乡村酒店。国家可以有M家酒店,酒店只有一个国家

HotelEntity

@Entity
@Table(name = "hotel")
public class HotelEntity {
    ...

    @ManyToOne(cascade= {CascadeType.PERSIST, CascadeType.MERGE,
            CascadeType.DETACH, CascadeType.REFRESH},
    fetch = FetchType.EAGER)
    @JoinColumn(name = "country_id")
    @JsonBackReference
    private CountryEntity country;

    ...
}
@Entity
@Table(name = "country")
public class CountryEntity {
    ...

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "country")
    @JsonManagedReference
    private List<HotelEntity> hotels;

    ...
}
CountryEntity

@Entity
@Table(name = "hotel")
public class HotelEntity {
    ...

    @ManyToOne(cascade= {CascadeType.PERSIST, CascadeType.MERGE,
            CascadeType.DETACH, CascadeType.REFRESH},
    fetch = FetchType.EAGER)
    @JoinColumn(name = "country_id")
    @JsonBackReference
    private CountryEntity country;

    ...
}
@Entity
@Table(name = "country")
public class CountryEntity {
    ...

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "country")
    @JsonManagedReference
    private List<HotelEntity> hotels;

    ...
}
@实体
@表(name=“country”)
公共类实体{
...
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy=“country”)
@JsonManagedReference
私人列表酒店;
...
}
这个。。。表示类的其余部分(如其他实体属性、getter、setter、constructor),它们与此问题没有任何共同之处,使其更难阅读和理解

所以。在我的第一次尝试中,我没有使用JsonManagedReferenceJsonBackReference,我得到了无限递归,堆栈溢出异常。这很有意义。。。有点。。。我使用Spring数据Jpa接口(内置方法)按Id加载了Country,该国有酒店列表(酒店有Country等)。这两个注释起了作用。直到我只需要按Id加载一家酒店。由于有注释,结果中不包括国家。我明白为什么。但是,是否有机会注释不包含的实体属性(或仅包含一次)取决于我从哪个实体加载另一方实体?

例如,我想加载酒店。对于Hotel,我喜欢序列化国家实体,但没有酒店列表(因此只需要名称、旗帜图像路径等基本信息)

但在另一种情况下,例如位置实体(与酒店相同的关系-位置有一个国家,国家有N个位置),我希望加载整个国家(包括属于该国家的酒店列表)

我不知道我的描述是否恰当,希望你能理解我


我自己想出的唯一解决方案是用@Query做我自己的接口方法heads,在那里我选择我真正想要的。但在我看来,这个解决方案似乎有点难看,我想问一下,是否有一种更漂亮的方法可以使用Jackson和其他Hibernate注释。

实体代表您的持久性模型。数据库中保存的内容。什么是由您的业务逻辑操纵的。您的通信模型(即RESTAPI返回或接受的内容)不同:一些服务返回一些字段,其他服务返回其他字段;有些服务返回whle国家,有些服务只返回或接受国家ID。因此,表示此通信模型的设计类(DTO)。并在返回这些DTO之前将实体转换为请求的DTO。是的,我知道这一点,但我希望系统能够在没有任何业务逻辑的情况下做到这一点。当我在酒店的桌子上看的时候,有一列是country_id。按你所说的做并不是最好的方式。在这些情况下,我不需要使用ORM,我必须检索对象,然后检索另一个对象(我在第一个对象中已经有了解决方案)并连接它们。