【问题标题】:ManyToMany - JPA - How to get data from mapping generated table?ManyToMany - JPA - 如何从映射生成的表中获取数据?
【发布时间】:2019-11-08 07:59:56
【问题描述】:

我有 2 个实体,组和成员。它们使用@ManyToMany 关系映射。我正在使用 Spring Data JPA 进行映射和数据库操作。

集团实体

@ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(
            name="Group_Members",
            joinColumns= @JoinColumn(name="id"),
            inverseJoinColumns= @JoinColumn(name="memberId")            
    )
    Set<MemberEntity> members = new HashSet<>();

会员实体

@ManyToMany(cascade=CascadeType.ALL, mappedBy="members")
    Set<GroupEntity> groups = new HashSet<>();

我已经成功实现了创建、读取和删除操作。我遇到的问题是更新。

正如预期的那样,我有 3 个表,Group - 包含 Group 主键和其他详细信息,Members - 包含在创建 Group 时创建的成员主键和成员详细信息,以及 Group_Members 表 - 这是包含 Group Id 的连接表以及属于各个组的成员 ID。到现在为止还挺好。效果很好。

现在进行更新,当我收到请求时,我不仅仅需要保存该组并希望 Cascade Merge 能够处理它。相反,我需要的是先获取该组的成员列表,然后进行检查,以防成员被删除,是否允许删除。

由于某些业务原因,某些成员无法从组中删除。因此,如果我碰巧遇到试图删除不应删除的成员的更新请求,我需要发回适当的消息。

为此,我需要获取该组的所有成员列表。现在我不知道该怎么做。因为我对存储组及其成员映射的第三张表没有任何句柄。我只有 2 个用于 Group 和 Member 的 CrudRepository 实例,我用它们来执行与它们相关的操作。

@Repository
public interface GroupRepository extends CrudRepository<GroupEntity, Integer> {

@Repository
public interface MemberRepository extends CrudRepository<MemberEntity, Integer>{

我需要的帮助是找出如何在使用 Spring Data JPA 进行多对多映射的情况下获取任何特定组的所有成员的列表?

如果你们中的任何人可以提出一些建议来帮助我,请告诉我。

【问题讨论】:

    标签: java database hibernate spring-data-jpa many-to-many


    【解决方案1】:

    你的问题看起来有点奇怪——你已经有一个Set,但在GroupEntity 中没有MembersList,那么有什么问题吗?在服务类中,例如GroupService添加这样的方法:

    public void removeMember(Integer groupId, Integer memberId) {
        GroupEntity group = groupManager.getById(groupId);
    
        Set<MemberEntity> members = group.getMembers();
    
        MemberEntity member = members.stream().filter(item -> Objects.equals(memberId, item.getId())).findFirst().orElse(null);
    
        if (Objects.nonNull(member)) {
            if (/** here is you condition of making a decision of deletion **/) {
                members.remove(member);
                groupManager.save(group);
            } else {
                // here is an action in case of remove canceling        
            }
        }
    }
    

    【讨论】:

    • 谢谢 Yuriv,我想这就是我想要的。 Set members = group.getMembers();应该为我解决问题。我在想我需要点击生成的第三个表,该表维护组和成员的映射以获取成员的详细信息。这帮助我获得了成员的详细信息。再次感谢。
    • @WebNoob 乐于助人)然后请投票给我的答案
    【解决方案2】:
    1. 获取所有将被删除的成员
    2. 验证是否可以删除它们(需要澄清 你这边,算法等)
    3. 如果每个人都适用于移除 - 移除它们,否则抛出 例外

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多