Вопрос или проблема
Боюсь, мне не удалось найти что-либо полезное, гугля на тему следующей проблемы.
Проблема
В моем приложении 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.
Решение проблемы
-
Измените определение столбца: Вместо использования аннотации
@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; }
-
Проверьте конфигурацию Dialect: Убедитесь, что в вашем
application.properties
илиapplication.yml
установлено правильное значениеhibernate.dialect
. Вы указали:SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.MariaDBDialect
Это правильно, но убедитесь, что этот класс действительно доступен в вашей версии Hibernate. Вы можете рассмотреть возможность использования более конкретного диалекта, если это потребуется.
-
Обновите зависимости: Убедитесь, что у вас установлены актуальные версии зависимостей. Используйте последнюю версию Hibernate и драйвер MariaDB. Например, маркетплейс Maven (Maven Central) может содержать более новые версии, чем вы сейчас используете.
-
Проверка конфигурации Docker: Убедитесь, что ваша настройка Docker корректно инициализирует базу данных. Проверьте, что контейнер MariaDB успешно запускается и что переменные окружения установлены правильно.
- Пересоздайте базу данных: После внесения изменений вам нужно будет пересоздать базу данных, если вы используете
spring.jpa.hibernate.ddl-auto=create
, чтобы изменения вступили в силу. Убедитесь, что у вас есть резервные копии данных, если это необходимо.
Заключение
Проблема, с которой вы столкнулись, скорее всего, связана с неправильным использованием определения типа данных для долгих текстов в Hibernate. Следуя данным рекомендациям, вы сможете устранить проблему и успешно создать таблицу в базе данных. Если ошибка продолжит появляться, стоит углубиться в логи Hibernate и MariaDB, чтобы получить дополнительную информацию о состоянии соединения и генерируемых запросах.