#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 Если это так, то, пожалуйста, поделитесь всей трассировкой стека с включенными журналами гибернации для дополнительного анализа.