【问题标题】:Spring, Question regarding Query on Many-to-Many(Association with Extra Columns) in web developmentSpring,关于 Web 开发中多对多查询(与额外列关联)的问题
【发布时间】:2021-07-28 14:14:38
【问题描述】:

我有 3 个类在实体级别使用多对多关系(herbibate) 他们是 Teams、Users 和 TeamUsers。

由于我使用的是hibernate,它们都是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>();

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 对象获取(Query)TeamUsers 对象和团队对象?或者只是通过 id 查询(来自 html 上的 TeamUsers)发送到 API 并简单地删除这个 TeamUsers 实体?

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

【问题讨论】:

    标签: spring hibernate frontend


    【解决方案1】:

    我建议如下

    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);
    

    【讨论】:

    • 谢谢!对于第二个问题(点 2),为什么它已设置在团队实体存储库中?我们应该在 TeauUser 存储库上这样做吗?有什么区别吗?
    猜你喜欢
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2011-07-04
    • 2023-02-02
    相关资源
    最近更新 更多