Spring data jdbc неправильное соединение "один ко многим"

Я использую spring-boot 2.3.3 и spring-data-jdbc 2.0.3 для моделирования связи между элементами гитары и classType. У гитары есть classType.

Моя схема в H2 (также в MySQL) такова:

CREATE TABLE class_type (
    id bigint NOT NULL AUTO_INCREMENT,
    description varchar(50) NOT NULL
    PRIMARY KEY (id)
);
CREATE TABLE guitars (
    id bigint NOT NULL AUTO_INCREMENT,
    name varchar(255) NOT NULL,
    description varchar(1000) NOT NULL,
    classType bigint NOT NULL,
    PRIMARY KEY (id),
    UNIQUE (name),
    FOREIGN KEY (classType) references class_type(id)
);

И у меня есть эти классы:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Table(value = "guitars")
public class Guitar {
    @Id
    long id;
    String name;
    String description;
    @MappedCollection(idColumn = "id")
    @Column(value = "classType")
    ClassType classType;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Table(value = "class_type")
public class ClassType {
    @Id
    Long id;
    String description;    
}

Мой репозиторий такой:

@Repository
public interface GuitarRepository extends CrudRepository<Guitar, Long>, PagingAndSortingRepository<Guitar, Long> {}

Когда я вызываю этот тест:

@SpringBootTest
public class GuitarOneManyTest {

    @Autowired
    GuitarRepository guitarRepository;

    @Test
    void findAllByName() {
        System.out.println(guitarRepository.findAll());
    }
}

Это предложение появляется с неправильным ЛЕВЫМ ВНЕШНИМ СОЕДИНЕНИЕМ

SELECT `guitars`.`id` AS `id`, `guitars`.`name` AS `name`, `guitars`.`description` AS `description`, `classType`.`id` AS `classType_id`, `classType`.`description` AS `classType_description` FROM `guitars` LEFT OUTER JOIN `class_type` AS `classType` ON `classType`.`id` = `guitars`.`id`

Но я хочу, чтобы выбор был таким:

SELECT (...) FROM `guitars` LEFT OUTER JOIN `class_type` AS `classType` ON `classType`.`id` = `guitars`.`classType`

Я что-то пропустил?

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

Ответы 1

Ответ принят как подходящий

Это не отношение один ко многим. Один Guitar будет ссылаться на несколько экземпляров ClassType.

Вместо этого кажется, что это отношение «многие к одному»: многие экземпляры Guitar могут ссылаться на один и тот же ClassType. Это делает ClassType агрегатом, отличным от Guitar, и поэтому на него нельзя ссылаться прямой ссылкой на Java, а только по его идентификатору.

См. Spring Data JDBC, ссылки и агрегаты для более подробного объяснения того, как моделировать такие отношения с помощью Spring Data JDBC.

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