Тип данных для хранения кавычек в Hibernate при создании базы данных

Вопрос или проблема

Боюсь, мне не удалось найти что-либо полезное, гугля на тему следующей проблемы.

Проблема

В моем приложении Spring Boot (3.3.3) не удается создать таблицу в MariaDB (Docker, mariadb:11.2.2-jammy) для следующей сущности:

    @Entity
    public final class Answer {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;

        @NotNull
        @Column(columnDefinition="LONGTEXT")
        private String text;
    }

Логи

Hibernate: create table `answer` (`id` bigint not null, `text` `LONGTEXT` not null, primary key (`id`)) engine=InnoDB
2024-09-19 23:59:21.367 [main] WARN  o.m.jdbc.message.server.ErrorPacket : Ошибка: 4161-HY000: Неизвестный тип данных: 'LONGTEXT'
2024-09-19 23:59:21.367 [main] WARN  o.h.t.s.i.ExceptionHandlerLoggedImpl: GenerationTarget вызвал исключение, принимая команду: Ошибка выполнения DDL "create table `answer` (`id` bigint not null, `text` `LONGTEXT` not null, primary key (`id`)) engine=InnoDB" через JDBC [(conn=415) Неизвестный тип данных: 'LONGTEXT']

Причина

Проблема заключается в том, что в сгенерированном SQL коде LONGTEXT появляется в кавычках. Я могу успешно запустить код вручную, удалив кавычки. Я не понимаю, почему кавычки там есть.

Коренная причина?

Есть идеи?

Дополнительная информация:

pom.xml

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope> <!-- для локальной разработки -->
        </dependency>
        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <version>3.4.1</version>
        </dependency>

Строки конфигурации окружения в Dockerfile:

      - SPRING_DATASOURCE_URL=jdbc:mariadb://mariadb:3306/${MYSQL_DATABASE}
      - SPRING_DATASOURCE_DRIVER_CLASS_NAME=org.mariadb.jdbc.Driver
      - SPRING_DATASOURCE_INITIALIZATION_MODE=always
      - SPRING_H2_CONSOLE_ENABLED=false
      - SPRING_JPA_HIBERNATE_DDL_AUTO=${SPRING_JPA_HIBERNATE_DDL_AUTO}
      - SPRING_JPA_SHOW_SQL=true
      - SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.MariaDBDialect

.env файл для Dockerfile

MYSQL_DATABASE=заменено
SPRING_JPA_HIBERNATE_DDL_AUTO=create
SPRING_H2_CONSOLE_ENABLED=false

Ответ или решение

Проблема, с которой вы столкнулись, связана с тем, что Hibernate неправильно обрабатывает тип данных LONGTEXT при создании таблицы в вашей базе данных MariaDB. В частности, ошибка говорит о том, что Hibernate генерирует SQL-код с типом данных, заключенным в кавычки, что приводит к его некорректному восприятию MariaDB.

Решение проблемы

  1. Измените определение столбца: Вместо использования аннотации @Column(columnDefinition="LONGTEXT"), попробуйте заменить ее на @Lob. Аннотация @Lob позволяет Hibernate автоматически генерировать соответствующий тип данных в SQL без необходимости вручную задавать определение столбца. Ваш код будет выглядеть следующим образом:

    import javax.persistence.*;
    
    @Entity
    public final class Answer {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
    
        @NotNull
        @Lob
        private String text;
    }
  2. Проверьте конфигурацию Dialect: Убедитесь, что в вашем application.properties или application.yml установлено правильное значение hibernate.dialect. Вы указали:

    SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.MariaDBDialect

    Это правильно, но убедитесь, что этот класс действительно доступен в вашей версии Hibernate. Вы можете рассмотреть возможность использования более конкретного диалекта, если это потребуется.

  3. Обновите зависимости: Убедитесь, что у вас установлены актуальные версии зависимостей. Используйте последнюю версию Hibernate и драйвер MariaDB. Например, маркетплейс Maven (Maven Central) может содержать более новые версии, чем вы сейчас используете.

  4. Проверка конфигурации Docker: Убедитесь, что ваша настройка Docker корректно инициализирует базу данных. Проверьте, что контейнер MariaDB успешно запускается и что переменные окружения установлены правильно.

  5. Пересоздайте базу данных: После внесения изменений вам нужно будет пересоздать базу данных, если вы используете spring.jpa.hibernate.ddl-auto=create, чтобы изменения вступили в силу. Убедитесь, что у вас есть резервные копии данных, если это необходимо.

Заключение

Проблема, с которой вы столкнулись, скорее всего, связана с неправильным использованием определения типа данных для долгих текстов в Hibernate. Следуя данным рекомендациям, вы сможете устранить проблему и успешно создать таблицу в базе данных. Если ошибка продолжит появляться, стоит углубиться в логи Hibernate и MariaDB, чтобы получить дополнительную информацию о состоянии соединения и генерируемых запросах.

Оцените материал
Добавить комментарий

Капча загружается...