ManyToMany - JPA - Как получить данные из сгенерированной таблицы сопоставления? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть 2 объекта: группа и участники. Они отображаются с использованием отношения @ManyToMany. Я использую Spring Data JPA для операций отображения и DB.

GroupEntity

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

MemberEntity

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

Я успешно реализовал операции Create, Read и Delete. У меня проблема с обновлением.

У меня 3 таблицы, как и ожидалось, группа - содержит первичный ключ группы и другие сведения, члены - содержит первичный ключ членов и сведения о членах, созданные при создании группы, и Group_Members. таблица - это таблица соединения, которая содержит идентификаторы групп и идентификаторов участников, принадлежащих отдельным группам. Все идет нормально. Работает хорошо.

Теперь для получения обновлений, когда я получаю запрос, мне не нужно просто сохранять эту группу и надеяться, что Cascade Merge позаботится об этом. Вместо этого мне нужно сначала получить список участников для этой группы, а затем выполнить проверку, в случае, если член удален, разрешено ли его удаление или нет.

Существуют определенные члены, которые не могутбыть исключенным из группы по каким-либо деловым причинам. Так что, если мне доведется встретить запрос на обновление, пытающийся удалить члена, который не должен быть удален, мне нужно отправить правильное сообщение.

Для этого мне нужно получить список всех участников для этогоГруппа. Теперь я не уверен, как это сделать. Потому что у меня нет никакого дескриптора в той третьей таблице, в которой хранится группа и ее отображение членов. Все, что у меня есть, это 2 экземпляра CrudRepository для группы и члена, которые я использую для выполнения операций, связанных с ними.

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

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

Здесь мне нужна помощь в выяснении, как получить список всех членов для любого конкретногогруппа в случае сопоставления ManyToMany с использованием Spring Data JPA?

Пожалуйста, дайте мне знать, если кто-нибудь из вас может предложить что-то, чтобы помочь мне.

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Ваш вопрос выглядит немного странно - у вас уже есть Set, но нет List из Members в GroupEntity, так в чем же проблема? В классе обслуживания, например, 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        
        }
    }
}
0 голосов
/ 08 ноября 2019
  1. Выбор всех участников, которые будут удалены
  2. Убедитесь, что их можно удалить (здесь требуется пояснение с вашей стороны, алгоритм и т. Д.)
  3. Если все применимы кудалить - удалить их, иначе выкинуть исключение
...