我正在使用jhipster v2。我有两个实体(父亲、女儿),父亲与女儿有一对多关系,女儿与父亲有多对一关系。我刚刚对生成的java代码进行了一次修改:
- 我已经将父女关系的获取类型配置为 EAGER。
当我得到所有的父亲时,在Java端我可以看到附加到父亲的女儿集合,但我看不到客户端(Anglarjs)端的集合,父亲javascript对象没有"女儿"属性。
正常吗?在服务器端:
@Entity
@Table(name = "T_CLIENT")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Client implements Serializable {
...
@OneToMany(mappedBy = "client", fetch = FetchType.EAGER)
@JsonIgnore
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private Set<Adresse> adresses = new HashSet<>();
@OneToOne
private Langue langue;
...
}
客户端(在我的 angularjs 控制器中):
$scope.clients = Client.query(function(){
$log.info($scope.clients);
});
在客户端,我可以看到客户端的"语言"属性,但客户端中没有"地址"属性。我不明白为什么。
感谢您的回答。
也许是由于注释@JsonIgnore
。如果您不使用 DTO 发送Client
,Jackson 将不会序列化和反序列化您的addresses
数据。
解决方案 1:删除@JsonIgnore
注释。
解决方案 2:创建一个类似 DTO UserDTO
并使用它来发送给您的客户端。我可以给你一个很棒的库:MapStruct(http://mapstruct.org)。它将帮助您非常轻松地将用户对象映射到用户DTO。它已经在最新版本的JHipster中使用。
解决方案3:如果这不是由于@JsonIgnore
的问题,但更多关于使用hibernate获取数据的信息,您将在此处找到答案:https://stackoverflow.com/a/19061378/4643869
你也可以试试
@JsonIgnoreProperties({"client"})
而不是@JsonIgnore,当它将 jSON 发送到客户端时,它将完全忽略它。
如果你想使用默认的jhipster代码,而不是修改生成的后端,让fetch懒惰,那么在前面的父亲集合中,你必须迭代该集合,并通过Id查询每个父亲,以获得加载所有女儿的新父亲。然后对这些数据做你想做的事。希望你不需要那么多,如果是这样,你需要在查询时使用分页。想想用户体验,为什么用户需要这么多数据。