Миграция с MySQL на PostgreSQL, Spring Boot
Делаю миграцию с MySQL на PostgreSQL.
Сразу после запуска я вижу постоянные одинаковые сообщения об ошибках с каждой сущностью и связями @OneToMany, @ManyToMany:
Caused by: org.postgresql.util.PSQLException: ОШИБКА: отношение "local_string" не существует
Позиция: 13
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440) ~[postgresql-42.2.5.jar:42.2.5]
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183) ~[postgresql-42.2.5.jar:42.2.5]
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308) ~[postgresql-42.2.5.jar:42.2.5]
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441) ~[postgresql-42.2.5.jar:42.2.5]
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365) ~[postgresql-42.2.5.jar:42.2.5]
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:143) ~[postgresql-42.2.5.jar:42.2.5]
at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:120) ~[postgresql-42.2.5.jar:42.2.5]
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) ~[HikariCP-3.4.2.jar:na]
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) ~[HikariCP-3.4.2.jar:na]
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]
... 109 common frames omitted
Если запустить проект еще раз, то содержательная часть(см выше)изменится на:
Caused by: org.postgresql.util.PSQLException: ОШИБКА: отношение "roles" не существует
Позиция: 83
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440) ~[postgresql-42.2.5.jar:42.2.5]
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183) ~[postgresql-42.2.5.jar:42.2.5]
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308) ~[postgresql-42.2.5.jar:42.2.5]
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441) ~[postgresql-42.2.5.jar:42.2.5]
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365) ~[postgresql-42.2.5.jar:42.2.5]
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:143) ~[postgresql-42.2.5.jar:42.2.5]
at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:106) ~[postgresql-42.2.5.jar:42.2.5]
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-3.4.2.jar:na]
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) ~[HikariCP-3.4.2.jar:na]
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]
... 110 common frames omitted
Полный стек(основной стек, который не меняется,за исключением последней части(см выше)): https://gist.github.com/orlovleo12/188a9c2c98628b45e4b150afc6710092
Данные ошибки вылетают для всех сущностей. Все сущности сделаны по одной структуре. Ниже пример типичной сущности:
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
@Table(name = "book")
public class Book {
public Book(LocaleString nameLocale, LocaleString author) {
this.name = nameLocale;
this.author = author;
}
public Book(Long id, OriginalLanguage originalLanguage, Long price, String coverImage) {
this.id = id;
this.originalLanguage = originalLanguage;
this.price = price;
this.coverImage = coverImage;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private LocaleString name;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private LocaleString author;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private LocaleString description;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private LocaleString edition;
private String yearOfEdition;
private Long pages;
private Long price;
private String coverImage;
private String originalLanguageName;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Singular("listImage")
private List<Image> listImage;
private Long views;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private OriginalLanguage originalLanguage;
private boolean isShow;
@OneToOne
private Category category;
}
Я попытался решить эти ошибки с помощью дополнительной конкретизации схемы(@Table..., schema = "hib"..), пример ниже(так я сделал в каждой сущности):
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
@Table(name = "book", schema = "hib")
public class Book {
После этого мне показалось, что проблема с сущностями исчезла, но после этого появилась проблема со связями(пример ниже):
Вызвано: org.postgresql.util.PSQLException: ОШИБКА: отношение "book_listImage" не существует
Где связь в Book такая:
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Singular("listImage")
private List<Image> listImage;
в Image :
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
@Table(name = "image")
public class Image {
public Image(String nameImage) {
this.nameImage = nameImage;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String nameImage;
}
Подчеркну, что таблица в БД существует:
