HibernateException: отсутствующий столбец: неправильное имя

В моем коде Java есть поле с именем isNegative с аналогичным столбцом, существующим в базе данных. Но Hibernate настаивает на том, чтобы имя было is_negative, даже с принудительным использованием имени @Column.

@Column(name = "isNegative")
private boolean isNegative;

Ошибка:

Caused by: org.hibernate.HibernateException: Missing column: is_negative in datasource.item

Application.properties:

#JPA
spring.data.jpa.repositories.enabled=false
spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
spring.jpa.generate-ddl=true
spring.jpa.open-in-view=true
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.hibernate.use-new-id-generator-mappings=false
spring.jpa.properties.hibernate.event.merge.entity_copy_observer=allow
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext

Можете ли вы показать файл hibernate.cfg.xml или application.properties, если вы используете Hibernate и Spring Framework вместе, или persistence.xml, если вы используете Hibernate в качестве реализации JPA?

Do Nhu Vy 17.08.2018 14:57

Возможный дубликат проблемы с именем столбца в спящем режиме

Arnaud 17.08.2018 14:58

@Arnaud Да, полностью; но дело в том, что смягчение не работает. Я установил стратегию именования PhysicalNamingStrategyStandard; но это не работает. Обходной путь (написание @column (name = "isnegative")) работает; но это слишком много для всех моих имен столбцов.

Ace 17.08.2018 15:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
3
572
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Это связано с вашей конфигурацией, потому что вы устанавливаете spring.jpa.hibernate.naming.physical-strategy на PhysicalNamingStrategyStandardImpl, который будет использовать символы подчеркивания для имен.

Если вы проверите Раздел Настроить стратегию именования Hibernate в Spring Docs, вы увидите, что:

Hibernate uses two different naming strategies to map names from the object model to the corresponding database names. The fully qualified class name of the physical and the implicit strategy implementations can be configured by setting the spring.jpa.hibernate.naming.physical-strategy and spring.jpa.hibernate.naming.implicit-strategy properties, respectively. Alternatively, if ImplicitNamingStrategy or PhysicalNamingStrategy beans are available in the application context, Hibernate will be automatically configured to use them.

By default, Spring Boot configures the physical naming strategy with SpringPhysicalNamingStrategy. This implementation provides the same table structure as Hibernate 4: all dots are replaced by underscores and camel casing is replaced by underscores as well. By default, all table names are generated in lower case, but it is possible to override that flag if your schema requires it.

Чтобы решить эту проблему, вам нужно удалить это свойство и вместо этого использовать стратегию именования по умолчанию:

spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.DefaultNamingStrategy

Спасибо, какое решение?

Ace 17.08.2018 15:46

Не используйте spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.Defau‌​ltNamingStrategy, вместо этого проверьте мой Edit.

cнŝdk 17.08.2018 16:16

Вам понадобятся spring.jpa.hibernate.naming.physical-strategy и spring.jpa.hibernate.naming.implicit-strategy

Добавление следующих

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

application.properties может помочь. Это решение будет работать в спящем режиме 5.

Надеюсь, поможет.

Пожалуйста, ознакомьтесь с моим анализом:

Если вы не хотите, чтобы ваша стратегия именования добавляла подчеркивание к имени столбца или имени класса, тогда стратегия, которую вам нужно использовать, будет выглядеть так: spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl. То, что вы предоставляете в аннотациях @Table и атрибут имени @Column’s, останется без изменений. Например. Атрибут имя в сущности получит имя столбца как имя, то есть без изменений.

Если вы не хотите предоставлять аннотации и хотите вручную обрабатывать имя таблицы и имена столбцов, вам следует расширить класс org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl и переопределить необходимые методы. Если вы все еще используете аннотации для некоторых случаев, помните, что переопределенные методы будут применяться к именам, написанным в этих аннотациях. spring.jpa.hibernate.naming.physical-strategy=example.CustomStrategy

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