Я настроил Spring-Boot для использования Hibernate для загрузки данных из встроенной базы данных H2. Схема в этой базе данных будет автоматически сгенерирована скриптом schema.sql, а затем будет заполнена данными из файла data.sql.
Содержание моего schema.sql:
CREATE TABLE BusinessModel (
ID INTEGER PRIMARY KEY,
NAME VARCHAR(256) NOT NULL,
DESCRIPTION VARCHAR(1024),
IMAGEURL VARCHAR(128)
);
Проблема в том, что hibernate автоматически добавляет в таблицу дополнительный столбец, который не определен в файле schema.sql. В журнале приложения я могу найти эту строку:
Hibernate: alter table APP.PUBLIC.BUSINESSMODEL add column image_url varchar(255)
Таким образом, столбец image_url добавляется автоматически. В H2-Console я вижу таблицу и ее содержимое. Там все столбцы из schema.sql добавлены и заполнены правильными данными. Кроме того, столбец image_url добавляется и остается пустым. Внутри моей сущности столбец imageurl отображается следующим образом:
@Column(name = "imageurl")
public String getImageUrl() {
return imageUrl;
}
Теперь моя проблема в том, что Hibernate ссылается и загружает данные из image_url, что неверно. До сих пор я не мог найти ни одного файла, в котором определено image_url. Есть ли какой-то тип кеша, который нужно очистить? Я перезапустил приложение несколько раз, удалил таблицу и изменил spring.jpa.hibernate.ddl-auto с none на create-drop обратно на none.
ОБНОВЛЕНИЕ 1 Полный класс BusinessModel:
@Entity
@Table(имя = "бизнес-модель") открытый класс BusinessModel реализует Serializable {
private static final long serialVersionUID = -3152463846487623463L;
@Id
private int id;
private String name, description, imageUrl;
public BusinessModel() {
}
@Column(name = "id", unique = true, nullable = false)
public int getID() {
return id;
}
public void setID(int id) {
this.id = id;
}
@Column(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name = "description")
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Column(name = "imageurl")
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
}
Я использую Spring-Boot 2.1.2.REALESE и, следовательно, интегрированную версию Hibernate. Кажется, Hibernate версии 5.3
ОБНОВЛЕНИЕ 2 приложение.свойства
# Hibernate
spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.H2Dialect
spring.jpa.show_sql=true
spring.datasource.initialize=true
spring.jpa.generate-ddl=true
# Database
spring.datasource.url=jdbc:h2:mem:app;create=true
# Enabling H2 Console
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
@Column должен преобладать над любой стратегией именования. Также spring.jpa.hibernate.ddl-auto было установлено на none. Таким образом, спящий режим не должен выполнять никаких DDL.
Можете ли вы добавить весь класс BusinessModel и конфигурацию базы данных?
Какую версию Hibernate вы используете? Мне пахнет жуком.
Это задокументировано. docs.spring.io/spring-boot/docs/current/reference/html/…
@JB Nizet - spring.jpa.hibernate.ddl-auto установлен на none - так что это не так.
Вы пробовали установить spring.jpa.generate-ddl=false? Пожалуйста, добавьте application.properties
Использование @Tijkijiki false приведет к ошибке в EntityManger. Я обновил свой пост с application.properties




Вероятно, это связано со стратегиями именования Hibernate... baeldung.com/hibernate-наименование-стратегия