当前位置: 首页 > 知识库问答 >
问题:

在Spring数据Rest中不获取多个One急切关联

东方国安
2023-03-14

我的Spring数据存储库被配置为默认@RepositoryRestResources,没有任何自定义

JPA实体:

@Entity
@Table(name = "flat")
public class Flat implements Serializable {

private static final long serialVersionUID = -7402659216552976109L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "flat_id")
private Integer id ;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "house_id", referencedColumnName="house_id",  insertable=false, updatable=false)
private House house;

@Column(name = "kad_num")
private String kadNum;

.....

我希望House obkect以JSON格式返回,作为Flat对象的嵌入部分,但只获取House的URL

/仓库/公寓/442991:

{
"kadNum" : "78:06:0002202:8981",
"sqrFull" : 52.7000,
"flatNum" : "311",
"_links" : {
    "self" : {
       "href" : "http://localhost:8080/kap/repository/flats/442991"
     },
    "house" : {
       "href" : "http://localhost:8080/kap/repository/flats/442991/house"
     }
  }
}

同时,User-Role OneTo多项关系被取好,角色名为:

@Entity
@Table(name = "\"user\"")
public class User {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id")
private Integer id;

private String login;

private String email;

private String password;

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "user_id", nullable=false , updatable = false, insertable = true)
private Set<Role> roles = new HashSet<Role>();
  .....

请求:/repository/users/5

{
 "id" : 5,
 "login" : "op898",
 "email" : "op20140603@gmail.com",
 "password" : "c6172176f8f5d7e660eb4dcfad07a6ca",
  "roles" : [ {
    "roleName" : "OPERATOR"
  } ],
  "_links" : {
  "self" : {
  "href" : "http://localhost:8080/kap/repository/users/5"
}
}
}

除了关系类型,我不知道有什么区别。任何想法?谢谢你们

共有2个答案

冯风史
2023-03-14

再次回答我自己。通过使用org最终解决了这个问题。springframework。数据Rest果心配置。投影我将classic HAL作为默认设置,并使用Flat创建了自定义投影。房产暴露。

马淇
2023-03-14

嗯,我已经找到了原因,但仍然不明白是否可以配置。

对于用户-角色关系,角色作为用户的嵌入式JSON对象返回,因为没有为角色实体定义存储库。但是House和Flat都有相应的JpaRepository,House作为Flat JSON对象中的唯一URL返回。Spring Data REST似乎总是在可以用REST获取实体的情况下,自动用JSON中的REST链接替换实体。一旦我从项目中移除House repository,Flat的JSON响应就变成了我想要的形式,带有嵌入式House:

{
  "house" : {
    "streetFull" : "KIMa pr.",
    "houseNum" : "1",
    "kadNum" : "78:06:0002202:3072",
    "building" : null,
    "liter" : "В",
    "sqrFull" : 10426.50,
    "sqrRooms" : 12868.10
  },
  "kadNum" : "78:06:0002202:9051",
  "sqrFull" : 43.8000,
  "flatNum" : "421",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/kap/repository/flats/442987"
    },
    "flats" : {
      "href" : "http://localhost:8080/kap/repository/flats/442987/flats"
    }
  }
}

但这不是一个解决方案,因为我需要Spring Data REST存储库也用于House实体。有什么想法吗?

 类似资料:
  • 问题是关于RowMapper在主/细节场景中的最佳实践用法,我们希望使用Spring jdbc急切地获取细节。 假设我们有Invoice和InvoiceLine类。 当将Spring Jdbc与行映射器一起使用时,我们通常有 现在的问题是我想急切地获取与此发票实例相关的InvoiceLine。如果我在rowmapper类中查询数据库可以吗?或者有人喜欢另一种方式?我使用下面的模式,但对此不满意。

  • 我有非常复杂的冬眠结构,有许多@manytomy、@ManyToOne、@OneToOne等关联。这些嵌套的集合/对象也有自己的嵌套对象/集合。整个对象被延迟加载。 我试图实现的是,对于一个特定的操作,能够急切地获取整个对象。 我做了一些研究,但我所能找到的只是需要指定每个对象/集合并手动获取的解决方案。 有没有一种方法可以获取整个对象结构,而无需指定需要获取的每个对象?

  • 我正在创建 Spring Boot Web 服务,我有一个模范员工 我想创建一个Get请求,它将根据用户给定的参数获取和过滤员工列表。 例如,如果用户提供员工的姓名和员工的指定,则 get 方法应筛选这些结果。对于各种参数组合,它应该可以工作。 为了避免多个if else情况,我根据上面的字符串和整数过滤列表。 我想我在下面的代码中犯了一个错误,该代码在控制器中发送请求。

  • 问题内容: 我在多对一元素中声明的域对象上有一个属性。此属性的基本语法如下所示: 现在,我们的想法是让Hibernate不急于获取此属性。它可能为null,因此设置了未找到的忽略。 但是,Hibernate在加载包含此关联的类时,会在加载父类时自行加载实际的类(甚至不是代理)实例。由于某些属性的大小超过1MB,因此它们会占用大量堆空间。 但是,如果将not-found设置为exception(或默

  • 我有以下课程: 现在我基本上想加载所有的,但在适用时渴望加载条,所以我使用以下查询: 虽然这是可行的,但它似乎为Bar实体生成了一个SELECT N 1问题: 有没有可能告诉hibernate急切地为子集合中的每个元素加载关联,而不使用N 1 SELECTs? 我尝试了以下查询的思路,这显然不起作用,因为它是一个集合: 我还尝试在(b.bar)bar中使用