Таблица не создается JPA

Таблица "книги" почему-то не создается.

Стол с моими книгами:

@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

Что является исключением? это MySQLSyntaxErrorException?

Zakir Hussain 16.03.2022 06:08

Вызвано: java.sql.SQLSyntaxErrorException

Vusal 16.03.2022 06:10

Проблемы могут быть из-за стратегии именования, можете ли вы попробовать добавить spring.jpa.hibernate.naming.physical-strategy=org.hibernate.‌​boot.model.naming.Ph‌​ysicalNamingStrategy‌​StandardImpl в свой файл application.properties?

Zakir Hussain 16.03.2022 06:13

Пытался. Это не помогло.

Vusal 16.03.2022 06:16

Пожалуйста, прочтите РЕДАКТИРОВАТЬ № 2. Также я теперь показываю поля is_rented и isbn.

Vusal 16.03.2022 06:32

Нашел ответ дружище. Спасибо.

Vusal 16.03.2022 06:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, проблема была с:

@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;

И это сработало :)

Другие вопросы по теме