как исправить несовместимые ограничения внешнего ключа при загрузке

#spring #database #spring-boot #hibernate #rest

Вопрос:

У меня есть приложение spring boot, в котором у меня есть две сущности в отношениях. Встречи и время встречи. Один набор собраний может иметь несколько собраний, и одно время собрания принадлежит одному набору собраний.

Я создаю базы данных с помощью sql-скрипта и ссылаюсь на их ключ foring для сущности meetingTime. Но я получаю следующую ошибку:

 Caused by: java.sql.SQLException: Referencing column 'meeting_name' and referenced column 'id' in foreign key constraint 'FK1omm6fk51xdsd0kysqbmleweg' are incompatible.
 

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

Встречи и встречи:

 @Entity
@Table(name = "meeting_settings")
@Data

public class MeetingsSetting {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "meeting_name")
    private String meetingName;

    @Column(name = "meeting_url")
    private String meetingUrl;

    @Column(name = "meeting_pw")
    private String meetingPw;

    @OneToMany(mappedBy = "meeting_Name", cascade = CascadeType.ALL)
    private Set<MeetingTime> meetingTime = new HashSet<>();
}
 

Время встречи:

 @Entity
@Table(name = "meeting_times")
@Data
public class MeetingTime {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "meeting_date")
    private String date;

    @Column(name = "start_time")
    private String startTime;

    @Column(name = "end_time")
    private String endTime;

    @Column(name = "meeting_name",insertable = false, updatable = false )
    private String meetingName;

    @ManyToOne
    @JoinColumn(name = "meeting_name", nullable = false)
    private MeetingsSetting meeting_Name;
}
 

and this is my script where I generate my tables:

 -- auto-generated definition
create table meeting_settings
(
    id           bigint auto_increment
        primary key,
    meeting_name varchar(255) null,
    meeting_pw   varchar(255) null,
    meeting_url  varchar(255) null
);

create table meeting_times
(
    id                  bigint auto_increment
        primary key,
    meeting_date        varchar(255) null,
    start_time          varchar(255) null,
    end_time            varchar(255) null,
    meeting_name        varchar(255) null,
    constraint fk_meeting_times_meeting_name
        foreign key (meeting_name) references meeting_settings (meeting_name)
);
 

Что могло вызвать такую ошибку? потому что я нигде не ссылаюсь на идентификатор.

Обновить:

 spring.datasource.url=jdbc:mysql://localhost:3306/coorporate_blinddate?createDatabaseIfNotExist=trueamp;useSSL=trueamp;serverTimezone=UTC
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect
spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=../generate.sql
spring.jpa.show-sql= true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto = update
spring.datasource.driver-class-name= com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=Test1234@@1amp;
server.port=8081
 

Последовательность перехода в спящий режим:

 Hibernate: create table meeting_settings (id bigint not null auto_increment, meeting_name varchar(255), meeting_pw varchar(255), meeting_url varchar(255), primary key (id)) engine=InnoDB
Hibernate: create table meeting_settings_meeting_time (meetings_setting_id bigint not null, meeting_name bigint not null, primary key (meetings_setting_id, meeting_name)) engine=InnoDB
Hibernate: create table meeting_times (id bigint not null auto_increment, meeting_date varchar(255), end_time varchar(255), meeting_name varchar(255), start_time varchar(255), primary key (id)) engine=InnoDB
Hibernate: alter table meeting_settings drop index UK_klg4vqmhi7o9qff83ymly598o
Hibernate: alter table meeting_settings add constraint UK_klg4vqmhi7o9qff83ymly598o unique (meeting_name)
Hibernate: alter table meeting_settings_meeting_time drop index UK_jsn83wsxfkpm1xfencvsdkqj1
Hibernate: alter table meeting_settings_meeting_time add constraint UK_jsn83wsxfkpm1xfencvsdkqj1 unique (meeting_name)
Hibernate: alter table meeting_settings_meeting_time add constraint FK9lq62drkkslq6x381b3lieruu foreign key (meeting_name) references meeting_times (id)
Hibernate: alter table meeting_settings_meeting_time add constraint FKglhgb5vgsviqm7t6vtmdx5e7t foreign key (meetings_setting_id) references meeting_settings (id)
Hibernate: alter table meeting_times add constraint FK1omm6fk51xdsd0kysqbmleweg foreign key (meeting_name) references meeting_settings (id)
 

Таблица, которая генерируется

 meeting_settings_meeting_time
meetings_setting_id
meeting_name
PRIMARY
UK_jsn83wsxfkpm1xfencvsdkqj1
FK9lq62drkkslq6x381b3lieruu
FKglhgb5vgsviqm7t6vtmdx5e7t
UK_jsn83wsxfkpm1xfencvsdkqj1
 

Ответ №1:

Похоже, ваша meeting_name колонка не уникальна для того, чтобы создавать отношения, которые вы создали. Добавить unique = true

 @Column(name = "meeting_name", unique = true)
private String meetingName;
 

И

 @OneToMany(cascade = CascadeType.ALL)
@JoinTable(inverseJoinColumns=@JoinColumn(name="meeting_name"))
private Set<MeetingTime> meetingTime = new HashSet<>();
 

Комментарии:

1. Привет, извините за поздний ответ. Я попробовал это в meetingSettings и meetingTime, но все равно получаю ту же ошибку. С указанием идентификатора

2. @haso Я обновил свой ответ, вы можете присоединиться, чтобы сказать, что это моя колонка «Присоединиться».

3. Спасибо за ответ, но теперь есть еще одна ошибка. Я думаю, что схожу с ума, ха-ха. Ассоциации, помеченные как сопоставленные, не должны определять сопоставления базы данных, такие как таблица соединений или столбец соединений: com.cbc.coorporateblinddateservice.entities.meetinsetting. Встречи.Время встречи

4. Если я выну часть mappedBy, старая ошибка повторится снова… с удостоверением личности

5. Я нашел эти два в журнале: Ошибка при выполнении DDL «alter table meeting_times отбрасывает внешний ключ FK1omm6fk51xdsd0kysqbmleweg» через таблицу операторов JDBC «coorporate_blinddate.meeting_settings_meeting_time» не существует, я всегда отбрасывал таблицу перед запуском приложения. Была ли это ошибка?