Я использую 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`
Я что-то пропустил?




Это не отношение один ко многим. Один Guitar будет ссылаться на несколько экземпляров ClassType.
Вместо этого кажется, что это отношение «многие к одному»: многие экземпляры Guitar могут ссылаться на один и тот же ClassType. Это делает ClassType агрегатом, отличным от Guitar, и поэтому на него нельзя ссылаться прямой ссылкой на Java, а только по его идентификатору.
См. Spring Data JDBC, ссылки и агрегаты для более подробного объяснения того, как моделировать такие отношения с помощью Spring Data JDBC.