Springboot JPA (спящий режим) не получает таблицу и столбец по имени

#spring #spring-boot #hibernate #jpa

#spring #spring-boot #спящий режим #jpa

Вопрос:

Когда я определяю свою модель как —

 @Entity
@Table
public class User{

    @Id
    @NotNull
    private String employeeId;

}
  

Я получаю эту ошибку —

Caused by: org.postgresql.util.PSQLException: ERROR: column user0_.employeeid does not exist

но когда я использую это —

 @Entity
@Table(name = "`User`")
public class User{

    @Id
    @NotNull
    @Column(name = "`employeeId`")
    private String employeeId;

}
  

В моем application.yml —

 spring:
  jpa:
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
        implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
      ddl-auto: update
    database-platform: org.hibernate.dialect.PostgreSQLDialect
  datasource:
    url: ${db.host}
    username: ${db.user}
    password: ${db.password}
  

Почему я получаю ошибку в первом? Я не хочу специально указывать имена, spring boot jpa должен автоматически находить таблицу и столбец по именованию.

Мои таблицы и столбцы совпадают с моим наименованием сущности и столбца, я не хочу менять имя, поэтому я использую PhysicalNamingStrategyStandardImpl

Что не так с 1-м?

Комментарии:

1. Используете ли вы hibernate.globally_quoted_identifiers свойство?

2. @SternK нет, я им не пользовался

3. @SternK, как вы можете видеть, он находит user0_.employeeid , но так и должно быть user0_.employeeId , он жаждет получить два низких значения

4. @SternK Я попробовал это, true и теперь это работает!! Спасибо! Вы можете опубликовать это как ответ

Ответ №1:

На самом деле, вам следует избегать использования имен таблиц или столбцов в верхнем регистре. Но если вы не хотите его изменять, вы можете указать hibernate использовать глобальные кавычки:

 <property name="hibernate.globally_quoted_identifiers" value="true" />
  

Ответ №2:

Прежде всего, вы используете устаревшую стратегию именования вместо стандартной, предоставляемой Spring boot . Спящий режим отображает имена полей, используя физическую стратегию и неявную стратегию. Hibernate использует стратегию физического именования для сопоставления наших логических имен с таблицей SQL и ее столбцами. Spring Boot предоставляет значения по умолчанию для обеих этих стратегий spring.jpa.hibernate.naming.physical-strategy по умолчанию org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy и spring.jpa.hibernate.naming.implicit-strategy по умолчанию org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy

Стратегия именования по умолчанию для spring-boot будет :

  • Замените точки подчеркиванием
  • Измените регистр верблюда на регистр змеи
  • Имя таблицы в нижнем регистре

Итак, если ваша база данных следует этим соглашениям при создании таблиц и столбцов, тогда вы можете удалить ключи stratergy именования hibernate application.properties , и spring автоматически подберет таблицы, разрешив их из самого имени.

Комментарии:

1. нет, мои таблицы и столбцы совпадают с моим наименованием сущности и столбца, я не хочу менять имя, вот почему я использую PhysicalNamingStrategyStandardImpl

2. @PankajSharma Если это так, то, пожалуйста, поделитесь всей трассировкой стека с включенными журналами гибернации для дополнительного анализа.