Что такое маппинг Many-to-Many в Hibernate?

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

от cierra , в категории: Java , 2 года назад

Что такое маппинг Many-to-Many в Hibernate?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

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

от violette_robel , 2 года назад

@cierra 

Mapping Many-to-Many в Hibernate относится к способу связывания двух сущностей, где каждая из них может иметь несколько связанных сущностей другой стороны. Таким образом, одна сущность может соответствовать многим другим сущностям, а также множество сущностей может соответствовать одной сущности.


В Hibernate для реализации связи Many-to-Many необходимо создать третью таблицу, которая будет содержать в себе ключи обеих связанных сущностей. Эта таблица называется таблицей-связью, или таблицей-ассоциации.


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


Например, если есть две сущности, Book и Author, и каждая книга может иметь несколько авторов, а каждый автор может быть связан с несколькими книгами, то для реализации связи Many-to-Many необходимо создать таблицу-ассоциацию book_author, которая будет содержать ключи обеих сущностей. В классе Book нужно использовать аннотацию @ManyToMany, указать имя таблицы-ассоциации и поле, которое будет использоваться в качестве ключа связи. Аналогично, в классе Author нужно использовать аннотацию @ManyToMany, указать имя таблицы-ассоциации и поле, которое будет использоваться в качестве ключа связи.

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

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

@cierra 

Маппинг Many-to-Many в Hibernate позволяет установить отношение между двумя сущностями, которое подразумевает, что каждая сущность может ссылаются на множество экземпляров другой сущности. Для этого, как правило, используется дополнительная таблица-связь, которая содержит в себе ключи обеих сущностей и устанавливает связь между ними.


Например, предположим у нас есть сущности "Книга" и "Автор" и существует множество книг, которые могут быть написаны различными авторами (и наоборот, один автор может иметь несколько книг). Для реализации многие-ко-многим взаимосвязи между этими сущностями в Hibernate, мы создадим таблицу-ассоциацию "book_author", которая будет содержать ключи обеих сущностей. Каждый раз, когда у нас есть экземпляр "Книги" и мы хотим установить связь с одним или несколькими авторами, или наоборот, у нас есть экземпляр "Автора" и мы хотим установить связь с одной или несколькими книгами, мы будем использовать таблицу-ассоциацию "book_author" для хранения таких связей.


На уровне кода классов в Hibernate, это будет выглядеть примерно следующим образом:

 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 = "book")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String title;
    
    @ManyToMany
    @JoinTable(name = "book_author",
            joinColumns = @JoinColumn(name = "book_id"),
            inverseJoinColumns = @JoinColumn(name = "author_id"))
    private Set<Author> authors = new HashSet<>();
    
    // геттеры и сеттеры
}

@Entity
@Table(name = "author")
public class Author {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToMany(mappedBy = "authors")
    private Set<Book> books = new HashSet<>();
    
    // геттеры и сеттеры
}


В данном примере, у нас есть классы Book и Author, которые устанавливают Many-to-Many отношение между ними через таблицу-ассоциацию "book_author". При этом, в классе Book мы указываем, что у нас есть множество авторов, а в классе Author мы указываем, что у нас есть множество книг. Все связи между этими классами будут храниться и управляться через таблицу-ассоциацию.