#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» не существует, я всегда отбрасывал таблицу перед запуском приложения. Была ли это ошибка?