Как удалить связь many-to-many в hibernate java?

Пользователь

от olen.shanahan , в категории: Java , год назад

Как удалить связь many-to-many в hibernate java?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от magali , 10 месяцев назад

@olen.shanahan 

Для удаления связи Many-to-Many в Hibernate вам потребуется выполнить следующие шаги:

  1. Определите сущности для обоих классов, участвующих в Many-to-Many связи (например, "User" и "Role").
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    // другие поля
    
    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "user_roles",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "role_id"))
    private List roles = new ArrayList<>();
    
    // геттеры и сеттеры
}

@Entity
@Table(name = "roles")
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    // другие поля

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "roles")
    private List users = new ArrayList<>();
    
    // геттеры и сеттеры
}


  1. Удалите связь Many-to-Many, удалив объект из коллекции связанных объектов и сохраните изменения в базе данных.
1
2
3
4
5
6
7
8
User user = userRepository.findById(userId).orElseThrow();
Role role = roleRepository.findById(roleId).orElseThrow();

user.getRoles().remove(role);
role.getUsers().remove(user);

userRepository.save(user);
roleRepository.save(role);


Обратите внимание, что вы должны использовать репозитории или DAO-объекты для выполнения операций базы данных (userRepository и roleRepository в примере выше), а также обрабатывать исключения и дополнительные проверки в своем коде.

Пользователь

от ian.heidenreich , 10 месяцев назад

@olen.shanahan 

Чтобы удалить связь many-to-many в Hibernate Java, вы можете воспользоваться следующими шагами:

  1. В вашей модели данных определите сущности, соответствующие вашей join таблице. Каждая сущность должна содержать ссылку на связанные объекты.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
@Entity
@Table(name = "join_table")
public class JoinEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "entity1_id")
    private Entity1 entity1;

    @ManyToOne
    @JoinColumn(name = "entity2_id")
    private Entity2 entity2;

    // Геттеры, сеттеры и другие поля...
}


  1. В основных сущностях (Entity1 и Entity2) определите связь many-to-many с помощью аннотации @ManyToMany.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
@Entity
@Table(name = "entity1")
public class Entity1 {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany(mappedBy = "entity1")
    private Set entity2Set;

    // Геттеры, сеттеры и другие поля...
}


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
@Entity
@Table(name = "entity2")
public class Entity2 {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany(mappedBy = "entity2")
    private Set entity1Set;

    // Геттеры, сеттеры и другие поля...
}


  1. Обновите код своего репозитория (DAO), чтобы удалить записи из join таблицы, связанные сущностями, которые вы хотите разорвать.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
@Repository
@Transactional
public class Entity1Repository {

    @PersistenceContext
    private EntityManager entityManager;

    public void removeEntity2FromEntity1(Entity1 entity1, Entity2 entity2) {
        String query = "DELETE FROM JoinEntity je WHERE je.entity1 = :entity1 AND je.entity2 = :entity2";
        entityManager.createQuery(query)
                .setParameter("entity1", entity1)
                .setParameter("entity2", entity2)
                .executeUpdate();
    }

    // Другие методы репозитория...
}


  1. Используйте метод removeEntity2FromEntity1() (или аналогичные методы в других репозиториях), чтобы удалить связь между сущностями.
1
2
3
Entity1 entity1 = entity1Repository.findById(1L);
Entity2 entity2 = entity2Repository.findById(1L);
entity1Repository.removeEntity2FromEntity1(entity1, entity2);


Таким образом, связь many-to-many будет разорвана путем удаления соответствующей записи из join таблицы.