首页 > 解决方案 > Spring,关于 Web 开发中多对多查询(与额外列关联)的问题

问题描述

我有 3 个类在实体级别(草本植物)中使用多对多关系,它们是团队、用户和团队用户。

因为我使用的是休眠,所以它们都是 Fetch Lazy

团队: 在此处输入图像描述

用户:在此处输入图像描述

团队用户:在此处输入图像描述

我们有 3 个接口(由 @Autowired 在 Service 或 repo 层使用),即:

1.TeamRepository extends PagingAndSortingRepository<Team, Integer>
2.UserRepository extends PagingAndSortingRepository<User, Integer>
3.TeamUserRepository extends PagingAndSortingRepository<TeamUsers, Integer>

这是多对多关系映射的核心代码:

团队班:

@OneToMany(mappedBy = "team", fetch = FetchType.EAGER)
    private Set<TeamUsers> team_users = new HashSet<TeamUsers>();

用户等级:

@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
    private Set<TeamUsers> team_users = new HashSet<TeamUsers>();

团队用户类:

@ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "TEAM_ID")
    private Team team;

    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "USER_ID")
    private User user;

现在,我的问题是,使用这些数据的最佳实践是什么?

例如:

1. 我需要数据库中的所有团队信息和团队成员

在restful控制器中获取映射功能,我应该返回什么?我应该使用 TeamUser 存储库(或者可能是另外一个服务层)返回 findAll() 吗?如果这样做,数据将作为用户和团队的对象集合出现(可能还包含该表中的额外列)?Json 能否成功包含该数据?

2. 我在网页上,我想从团队中删除一个用户。

在这个时间点,我知道来自 HTML 的 TeamID 和 UserID,当我将 Post 请求发送到 API 时,我应该通过 UserID 获取 User 对象,然后通过 TeamID 获取 Team 对象,然后通过提供 User 对象和 Team Object 来获取(Query)TeamUsers 对象? 或者只是通过 id 查询(来自 html 上的 TeamUsers)发送到 API 并简单地删除这个TeamUsers实体?

我是 Spring 和前端开发的新手,非常感谢您的帮助!

标签: springhibernatefrontend

解决方案


我建议以下

  1. 如果您想返回所有团队和每个团队的所有用户,您应该有一个 TeamService 调用团队存储库的 findAll 方法,这样您将获得团队列表和每个团队的用户集。如果不是这样,您希望所有用户以及每个用户的团队是什么,您应该以另一种方式做,请调用用户存储库的 findAll 方法

只要对象具有其构造函数以及 getter 和 setter 方法,这两种解决方案都将毫无问题地序列化为 json

  1. 如果您只想删除用户和团队之间的关系,您可以在 TeamEntity Spring Data 存储库中有一个方法,如下所示

    long deleteByTeamIdAndUserId(long teamId, long userId);

spring 将创建一个方法来执行此操作,或者您可以在方法名称上方编写您喜欢的查询以更具体

@Modifying
@Query("delete from TeamUsers t where t.userId=:userId and t.teamId = :teamId")
long deleteByTeamIdAndUserId(long teamId, long userId);

推荐阅读