Nextrp [CPP] RU + Many GEOs Игра на карте России | NEXTRP

JPA Hibernate каскадирование многих ко многим

hibernate jpa many-to-many jpa-2.0 cascade

55747 просмотра

4 ответа

3611 Репутация автора

Я использую JPA 2.0 и спящий режим. У меня есть класс пользователя и класс группы следующим образом:

public class User implements Serializable {
    @Id
    @Column(name="USER_ID")
    private String userId;

    @ManyToMany
    @JoinTable(name = "USER_GROUP",
               joinColumns = {
                   @JoinColumn(name = "GROUP_ID")
               },
               inverseJoinColumns = {
                   @JoinColumn(name = "USER_ID")
               }
    )
    private Set<Group> groupList;

    //get set methods
}

public class Group
{
    @Id
    @Column(name="GROUP_ID")
    private String groupId;

    @ManyToMany(mappedBy="groupList")
    private Set<User> memberList;
    //get set methods
}

Затем я создаю пользователя и группу, а затем назначаю пользователя группе.

То, что я хочу получить, - это когда я удаляю группу, группа будет удалена (конечно), и все отношения группы пользователей, которые есть у группы, будут автоматически удалены из таблицы присоединения USER_GROUP, но сам пользователь не будет удален из ПОЛЬЗОВАТЕЛЬСКИЙ стол.

С кодом, который у меня есть выше, только одна строка в таблице GROUP будет удалена, когда я удаляю группу, и у пользователя все еще будет запись в удаленной группе в таблице присоединения USER_GROUP.

Если я помещу каскад в класс User следующим образом:

@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name = "USER_GROUP",
joinColumns =
{
    @JoinColumn(name = "GROUP_ID")
},
inverseJoinColumns =
{
    @JoinColumn(name = "USER_ID")
})
private Set<Group> groupList;

Когда я удаляю группу, пользователь также будет удален!

Есть ли способ добиться того, чего я хочу?

Автор: Hery Источник Размещён: 08.02.2011 03:42

Ответы (4)


37 плюса

21686 Репутация автора

Решение

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

Измените JoinTableотображение с Userна Groupи сделайте groupListсвойство Userтаким, чтобы оно имело mappedByатрибут. Это изменит группу на управляющую сторону отношений и сделает постоянные / обновленные вызовы для группы, управляющей таблицей соединений.

Но учтите, что вы не сможете просто добавить группу к пользователю, сохранить пользователя и продолжить, вместо этого вам придется добавить пользователя в группу и сохранить группу, чтобы увидеть изменения, но имея двунаправленное отношение «многие ко многим», мы надеемся, что в любом случае вы будете тесно управлять этими отношениями.

Автор: digitaljoel Размещён: 08.02.2011 04:23

4 плюса

41 Репутация автора

Как уже указывалось, сделайте владельцем группы отношение, если вам не нужно каскадировать со стороны пользователя.

Затем попробуйте использовать, cascade=CascadeType.MERGEчтобы не удалять каскад пользователя при удалении группы.

Автор: atidafi Размещён: 18.02.2011 08:36

5 плюса

9717 Репутация автора

Видя проблему под другим углом:

Вы можете добавить ограничения FK в таблицу сопоставления «многие ко многим». На самом деле вы всегда должны иметь FK в вашей БД по причинам целостности данных. В этом случае, например, по крайней мере, пользователь не может быть удален, когда он молча оставляет пустые строки в таблице сопоставления.

Если у вас есть FK, вы можете указать каскадное действие при удалении. для ограничений, и БД будет управлять автоматическим удалением таблицы сопоставления, но не сущности, как вы просили.

Автор: Pierre Henry Размещён: 01.08.2011 09:37

0 плюса

21 Репутация автора

Вы можете сделать что-то вроде этого

@PreRemove
private void removeMembers() {
    this.memberList.clear();
}
Автор: Vicenzo Martinelli Размещён: 05.06.2019 12:27
Вопросы из категории :
32x32