gpt4 book ai didi

java - 在 spring 中,一对多实体关系不获取数据

转载 作者:太空宇宙 更新时间:2023-11-04 09:23:24 25 4
gpt4 key购买 nike

我有一个简单的场景,其中用户技能之间存在关系,意味着一个用户拥有多种技能,所以我尝试了:

用户

@Data
@NoArgsConstructor
@Entity
@EqualsAndHashCode
public class User {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
@OneToMany(mappedBy = "user")
private List<Skill> skills;

}

技能

@Data
@NoArgsConstructor
@Entity
@EqualsAndHashCode
public class Skill {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String skillTitle;
@ManyToOne
@JoinColumn(name="user_id")
private User user;

}

用户存储库

@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRepository extends PagingAndSortingRepository<User, Long> {
List<User> findByName(@Param("name") String name);
}

技能库

@RepositoryRestResource(collectionResourceRel = "skills", path = "skills")
public interface SkillRepository extends CrudRepository<Skill, Long>{

}

通过以上所有内容,我可以在例如 url http://localhost:8085/users/1

处获得响应
{
"name": "Root",
"_links": {
"self": {
"href": "http://localhost:8085/users/1"
},
"user": {
"href": "http://localhost:8085/users/1"
},
"skills": {
"href": "http://localhost:8085/users/1/skills"
}
}
}

问题不是我不明白为什么没有获取技能列表,为什么只获取了这个

"skills": {
"href": "http://localhost:8085/users/1/skills"
}

不是与 user/1 相关的技能的完整列表。

更新

按照建议添加了投影:UserProjection.java

@Projection(name = "inlineData", types=User.class)
public interface UserProjection {
String getName();
List<Skill> getSkills();
}

UserRepository.java 是

@RepositoryRestResource(collectionResourceRel = "users", path = "users", excerptProjection = UserProjection.class)
public interface UserRepository extends PagingAndSortingRepository<User, Long> {
List<User> findByName(@Param("name") String name);
}

响应是:

{
"name": "Root",
"_links": {
"self": {
"href": "http://localhost:8085/users/1"
},
"user": {
"href": "http://localhost:8085/users/1{?projection}",
"templated": true
},
"skills": {
"href": "http://localhost:8085/users/1/skills"
}
}
}

最佳答案

响应是正确的,它按预期工作。 @RepositoryRestResource 遵循 HATEOAS原则。 Spring documentation解释如下:

5.1.3. Resource Discoverability

A core principle of HATEOAS is that resources should be discoverable through the publication of links that point to the available resources ...

By issuing a request to the root URL ... the client can extract, from the returned JSON object, a set of links that represent the next level of resources that are available to the client ...

您将获得代表资源的链接。要检索特定资源,您应该调用相应的 URL。您对用户 1 的回复意味着,如果您想获得用户 1 的技能,您应该调用 URL“http://localhost:8085/users/1/skills”。

如果您想象有一个显示用户 1 属性的 HTML 页面,则更容易理解。该页面不直接显示技能,而是包含指向技能页面的链接。仅当用户单击此链接时,才会加载“技能”页面。

了解 HATEOAS 很重要好吧。

当然,在某些情况下,HATEOAS 可能不是最佳选择。但这里我们不是讨论 HATEOAS,而是解释 Spring 这个实现背后的想法是什么。这种方法在很多情况下确实很有帮助。当你有 2 个具有 1-2 个属性的实体时,你可能会认为这种方法是矫枉过正。但是,如果您有 30 - 50 个实体,每个实体有 3 - 5 个关系,每个关系包含 50 - 100 个其他实体,则处理这样的数据模型可能会非常困难。 HATEOAS 可以让这一切变得更加容易。使用这种方法,您只需导航这些关系:加载一个实体,选择所需的关系,加载此关系上的实体,选择所需的实体,在此实体中选择所需的关系,加载此关系,或通过父关系导航回其父实体,等等。

关于java - 在 spring 中,一对多实体关系不获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58037282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com