Таблица "книги" почему-то не создается.
Стол с моими книгами:
@Entity
@Table(name = "books")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", nullable = false)
private Long id;
@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "publisher_id", nullable = false)
private Publisher publisher;
@ManyToMany
@JoinTable(name = "authors_books", joinColumns = @JoinColumn(name = "book_id"),
inverseJoinColumns = @JoinColumn(name = "author_id"))
private Set<Author> authors;
@Column(name = "is_rented", nullable = false, columnDefinition = "DEFAULT FALSE")
private Boolean is_rented;
@Column(name = "isbn", nullable = false, unique = true, length = 300)
private String isbn;
Таблица издателей:
@Entity
@Table(name = "publishers")
public class Publisher {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", nullable = false)
private Long id;
@OneToMany(mappedBy = "publisher")
private Set<Book> books;
Таблица авторов:
@Entity
@Table(name = "authors")
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", nullable = false)
private Long id;
@ManyToMany(mappedBy = "authors")
private Set<Book> books;
приложение.свойства:
spring.jpa.hibernate.ddl-auto=create
spring.jpa.database=mysql
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/<schema_name>?createDatabaseIfNotExist=true
spring.datasource.username=${MYSQL_USERNAME}
spring.datasource.password=${MYSQL_PASSWORD}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Другие поля опущены, оставлены только справочные поля. Я также переустанавливаю методы equals и hashcode во всех сущностях. И у меня есть пустые конструкторы и полные конструкторы, а также геттеры и сеттеры во всех них. Также добавлен @EntityScan в файл SpringBootApplication.
Я получаю сообщение об ошибке:
Table '<schema_name>.authors_books' doesn't exist.
Table '<schema_name>.books' doesn't exist.
Но все остальные таблицы существуют. Кто-нибудь видит, что мне не хватает?
РЕДАКТИРОВАТЬ
Проверял базу вручную. Таблица "authors_books" ДЕЙСТВИТЕЛЬНО существует (несмотря на то, что jpa сказал мне, что это не так). Только "книг" НЕТ.
РЕДАКТИРОВАТЬ #2
Я добавил в application.properties:
spring.jpa.show-sql = правда spring.jpa.properties.hibernate.format_sql = правда
И это показывает мне:
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "
create table books (
id bigint not null,
amount integer not null,
image varchar(300),
is_rented DEFAULT FALSE,
isbn varchar(300) not null,
published_on date,
title varchar(300) not null,
publisher_id bigint not null,
primary key (id)
) engine=InnoDB"
Вызвано: java.sql.SQLSyntaxErrorException: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «DEFAULT FALSE, isbn varchar(300) не нуль, ' в строке 5
Вызвано: java.sql.SQLSyntaxErrorException
Проблемы могут быть из-за стратегии именования, можете ли вы попробовать добавить spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
в свой файл application.properties?
Пытался. Это не помогло.
Пожалуйста, прочтите РЕДАКТИРОВАТЬ № 2. Также я теперь показываю поля is_rented и isbn.
Нашел ответ дружище. Спасибо.
Похоже, проблема была с:
@Column(name = "is_rented", nullable = false, columnDefinition = "DEFAULT FALSE")
private Boolean is_rented;
Если вы настроите columnDefinition, то Hibernate не будет заботиться о предоставленном вами типе данных на основе Java.
Итак, SQL был таким:
is_rented DEFAULT FALSE,
Поэтому я изменил его на:
@Column(name = "is_rented", columnDefinition = "BOOLEAN DEFAULT FALSE")
private Boolean is_rented;
И это сработало :)
Что является исключением? это MySQLSyntaxErrorException?