Данные Spring не возвращают уникальные сущности для нескольких уникальных строк

Итак, предыстория этой проблемы: я создал календарь событий, который позволяет событиям охватывать несколько дней. В моей БД у меня есть таблица для события, и у меня есть таблица с именем event_dates, которая представляет собой просто event_id и дату.

Чтобы правильно получить строки с датами событий, я делаю INNER JOIN on EVENT_DATES (event_id)

Возврат из базы данных правильный, строка содержит всю информацию о событии вместе со столбцом «дата», прикрепленным в конце.

Мой домен для класса событий:

@Data
@Entity
@Table(name = "events")
@SecondaryTable(name = "event_date", pkJoinColumns=@PrimaryKeyJoinColumn(name = "event_id", referencedColumnName = "event_id"))
@RequiredArgsConstructor
public class Event {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "event_id")
    private Long id;

    private String eventTitle;
    private String eventCategory;
    private String eventType;


    @Column(table = "event_date", name = "date", columnDefinition = "DATE", unique=true)
    private LocalDate date;

    @Column(table = "event_date", name = "event_date_id")
    private Long eventDateId;

    private boolean allDayEvent;

    @Column(name = "start_time", columnDefinition = "TIME")
    private LocalTime startTime;

    @Column(name = "end_time", columnDefinition = "TIME")
    private LocalTime endTime;

    private String timezone;
    private boolean onlineEvent;
    private String city;
    private String state;
    private String country;
    private String language;
    private String description;
    private boolean register;
    private String registrationLink;
    private boolean multiDay;

}

Вот где возникает проблема:

Пока db возвращает каждую строку вместе с правильными датами (без повторяющихся дней),

Spring data создает первую строку как объект с первой датой, но затем, когда он попадает в следующую строку, он видит, что идентификатор для события такой же, как у предыдущей сущности, и просто копирует эту сущность снова в массив, он никогда не проверяет, уникальна ли дата для этого объекта. Даты никогда не меняются, и важно, чтобы это происходило или мой api возвращал события, происходящие снова и снова в один и тот же день (правильное количество дубликатов, однако, ха-ха).

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

Я видел использование @UniqueConstraint, но проблема в том, что @UniqueConstraint охватывают две таблицы, а не одну и ту же таблицу, и я не нашел никаких примеров, показывающих, как настроить для этого типа ситуации.

Я там как 95%, мне просто нужно, чтобы даты для каждой сущности были уникальными!

Покажите код Event полностью.

Alan Hay 18.12.2018 16:32

обновлено, чтобы включить полное событие

Addison Joseph 18.12.2018 16:37

В этом нет никакого смысла. Мне кажется, что у вас есть событие, а у события есть набор дат. Вам нужно прочитать об отношениях JPA.

Alan Hay 18.12.2018 16:41

клиент хочет, чтобы список дней перебирался. не список событий с несколькими датами в коллекции. вот почему я должен сделать это так.

Addison Joseph 18.12.2018 16:44

Либо событие имеет коллекция дат, либо событие имеет составной ключ JPA, состоящий из идентификатора и даты. Вам нужно взглянуть на основы.

Alan Hay 18.12.2018 16:46

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

Addison Joseph 18.12.2018 16:48

Составные ключи @AddisonJoseph не являются хорошей практикой, и их следует избегать. Я предлагаю вам взглянуть на автоинкрементные идентификаторы или автоматически сгенерированные технические идентификаторы.

Keka Bron 19.12.2018 00:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
127
0

Другие вопросы по теме