Возникли проблемы при создании отображения JPA со структурой таблицы MYSQL - PullRequest
0 голосов
/ 08 июля 2019

У меня есть таблица, которая моделирует отношения, в которых страна может поддерживать несколько типов высоты тона.Таким образом, США поддерживают типы высоты звука 1, 2 и 3. MX поддерживает типы высоты звука 2, 3 и 4.

Таблица pitch_type представляет собой простое значение ключа с pitch_type_id, ссылающимся на строковое значение.Таблица, которая объединяет типы с кодами стран, находится здесь:

CREATE TABLE `country_pitch` (
  `country_pitch_id` INT NOT NULL AUTO_INCREMENT,
  `country_code` VARCHAR(2) NOT NULL,
  `pitch_type_id` INT NOT NULL,
  PRIMARY KEY (`country_pitch_id`),
  INDEX `fk_country_code_to_pitch_type_id_idx` (`pitch_type_id` ASC),
  CONSTRAINT `fk_country_code_to_pitch_type_id`
    FOREIGN KEY (`pitch_type_id`)
    REFERENCES `pitch_type` (`pitch_type_id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION);

выход:

---------------------------------------------------
| country_pitch_id | country_code | pitch_type_id |
---------------------------------------------------
| 1                | us           | 1             |
| 2                | us           | 2             |
| 3                | us           | 3             |
| 4                | mx           | 2             |
| 5                | mx           | 3             |
| 6                | mx           | 4             |
---------------------------------------------------

country_pitch_id не используется, и важной концепцией является соответствие кода страны соответствующему типу pitch_type..

Я полагаю, что это лучше всего представить отношением ManyToMany, так как страна может иметь несколько типов шага, а тип шага может принадлежать нескольким странам.Моя цель состоит в том, чтобы смоделировать это в POJO, подобном следующему:


/**
 * For a given market, US, CA, MX, etc, identify the available reach
 * generation curve types
 */
@Entity(name = "country_pitch")
@Data
public class CountryPitchTypes {
    public CountryPitchTypes() {}

    @Column(name = "country_code")
    private String countryCode;

    @ElementCollection
    @Convert(converter = PitchTypeConverter.class)
    private List<PitchType> pitchTypes;
}

, но это отображение не работает "из коробки", потому что я пытаюсь сопоставить таблицу соединения с этой сущностью, поэтому я получаю Unknown column ошибок.Можете ли вы подсказать мне, каким будет правильное дополнение к pojo, чтобы сопоставить эту таблицу с одним pojo со связанным списком?

Я чувствую, что аннотация @JoinTable необходима с какой-то группировкой, но я не знаю, как ее настроить.В конце дня, Я пытаюсь сопоставить таблицу country_pitch с классом CountryPitchTypes, группируя все типы высоты по коду страны.

Коды стран не являются частью нашей базы данныхкстатиТо есть, нет таблицы countries, в которой значение country_id указывает на двухбуквенный код страны.

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Поскольку код страны может быть сопоставлен с n типами основного тона, а один тип основного тона может быть сопоставлен с n странами. Таким образом, у нас есть отношение ManyToMany

У вас есть 2 способа реализации отношения ManyToMany, либо с использованием составного первичного ключа, используя2 реляционных столбца или использование одного первичного идентификатора вместе с 2 реляционными столбцами так же, как вы делаете с country_pitch_id, поэтому следование всей этой сущности должно быть следующим:

@Entity(name = "country_pitch")
@Data
public class CountryPitchTypes {
    public CountryPitchTypes() {}

    @Id
    @Column(name = "country_pitch_id", updatable = false, nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY) // or whatever strategy you see good
    private Long countryPitchId

    @Column(name = "country_code")
    private String countryCode;

    @JoinColumn(name = "pitch_type_id", referencedColumnName = "pitch_type_id")
    @ManyToOne
    @Convert(converter = PitchTypeConverter.class)
    private PitchType pitchType;
}

Теперь вы можете сделать что-токак

SELECT cpt.pitchType from CountryPitchTypes cpt group by cpt.countryCode;

Примечание Помните, что отношение ManyToMany в основном создает третью таблицу country_pitch, где у вас есть поля ManyToOne для другой таблицы pitch_type, у которой OneToMany этой третьей таблицы так,теперь вы можете обновить PitchType сущность, чтобы иметь OneToMany CountryPitch, но вы все равно не будете ее использовать, поэтому достаточно одного из отношений, это, кстати, так называемое однонаправленное отношение .

В JPA аннотация @ManyToMany используется, когда в третьей таблице нет лишних столбцов country_pitch_id только 2 реляционных столбца, так что JPA неявно понимает, что таблица используется для связи ManyToMany. Затем можно использовать@ManyToMany для связанных объектов без создания 3-го объекта.

0 голосов
/ 09 июля 2019

В этом случае аннотация ManyToMany неверна. Это означает, что многие CountryPitchTypes отображаются на многие из PitchType. Что вам нужно здесь, так это OneToMany.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...