@ManyToMany не загружается

Есть три таблицы. Первая календарь с датами.

@Entity
@NamedEntityGraph(
        name = "eventCalendar.events",
        attributeNodes = @NamedAttributeNode("events"),
        subgraphs = {
                @NamedSubgraph(
                name = "event-with-contacts-and-eventContents",
                type = Event.class,
                attributeNodes = { @NamedAttributeNode("contacts"),
                                    @NamedAttributeNode("eventContents") })})
public class EventCalendar extends BaseEntity {
    private Long day;
    @Column(columnDefinition = "boolean default false")
    private Boolean isActive;
    @OneToMany(mappedBy = "eventCalendar",cascade = CascadeType.ALL)
    private List<Event> events = new ArrayList<>();
}

На каждую дату может быть несколько событий.

@Entity
@NamedEntityGraph(name = "event-with-contacts-and-eventContents",
        attributeNodes = { @NamedAttributeNode("contacts"), @NamedAttributeNode("eventContents") })
public class Event extends BaseEntity {
    @OneToMany(mappedBy = "event",cascade = CascadeType.ALL)
    private List<EventContent> eventContents = new ArrayList<>();
    @ManyToOne
    @JoinColumn(name = "event_calendar_id")
    private EventCalendar eventCalendar;
    @ManyToMany
    private Set<Contact> contacts = new LinkedHashSet<>();
}

И у каждого события может быть много участников, как и один участник может быть в списке многих событий

@Entity
public class Contact extends BaseEntity {
    private String surname;
    private String name;
    private String patronymic;
    @ManyToMany
    private Set<Event> events = new LinkedHashSet<>();
}

репозиторий для календаря

@Repository
public interface EventCalendarRepository extends BaseRepository<EventCalendar> {
    @EntityGraph(value = "eventCalendar.events", type = EntityGraph.EntityGraphType.LOAD)
    List<EventCalendar> findByDayIn(Long[] days);
}

Поле eventContents загружается, а contacts нет. Как поправить?


Ответы (1 шт):

Автор решения: Anton Charov

Нужно явно описать таблицу для связи многие ко многим, иначе hibernate создает две таблицы.

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "events_contacts",
        joinColumns = @JoinColumn(name = "event_id"),
        inverseJoinColumns = @JoinColumn(name = "contact_id"))
private Set<Contact> contacts = new LinkedHashSet<>();
→ Ссылка