У меня есть приложение Spring Boot с зависимостью spring-boot-starter-data-jpa
. В моем классе сущности есть аннотация столбца с именем столбца. Например:
@Column(name="TestName")
private String testName;
SQL, сгенерированный этим, создается test_name
как имя столбца. После поиска решения я обнаружил, что spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
решает проблему (имя столбца взято из аннотации столбца).
Тем не менее, мой вопрос в том, почему без naming_strategy, установленного в EJB3NamingStrategy
JPA, игнорируется аннотация столбца? Может диалект гибернации как-то здесь? Я подключаюсь к MS SQL 2014 Express, и мои журналы содержат:
Unknown Microsoft SQL Server major version [12] using SQL Server 2000 dialect
Using dialect: org.hibernate.dialect.SQLServerDialect
java
hibernate
jpa
spring-boot
Камиль
источник
источник
@Column(name="...")
аннотацию, например, когда вы используете тип доступа, отличный от ожидаемого, но здесь это не так.Ответы:
Для hibernate5 я решил эту проблему, поместив следующие строки в свой файл application.properties:
источник
По умолчанию Spring использует
org.springframework.boot.orm.jpa.SpringNamingStrategy
для генерации имен таблиц. Это очень тонкое расширениеorg.hibernate.cfg.ImprovedNamingStrategy
.tableName
Метод в этом классе передается исходноеString
значение , но не знает , если она исходит от@Column.name
атрибута или если оно неявно генерируется из имени поля.Преобразование
ImprovedNamingStrategy
будет происходитьCamelCase
в том месте,SNAKE_CASE
гдеEJB3NamingStrategy
просто используется имя таблицы без изменений.Если вы не хотите менять стратегию именования, вы всегда можете просто указать имя столбца в нижнем регистре:
источник
Кажется, что
полностью игнорируется, если нет
указано, так что для меня это ошибка.
Я потратил несколько часов, пытаясь понять, почему @Column (name = "..") игнорируется.
источник
Стратегия по умолчанию для
@Column(name="TestName")
будетtest_name
, это правильное поведение!Если у вас есть столбец с именем
TestName
в вашей базе данных, вы должны изменить аннотацию столбца на@Column(name="testname")
.Это работает, потому что базе данных безразлично, назовете ли вы свой столбец TestName или testname ( имена столбцов нечувствительны к регистру !! ).
Но будьте осторожны, то же самое не относится к имени базы данных и именам таблиц, которые чувствительны к регистру в системах Unix, но чувствительны к регистру в системах Windows (тот факт, что, вероятно, не давал уснуть по ночам, работая с Windows, но развертываясь в Linux. :))
источник
Единственное решение, которое сработало для меня, было опубликовано teteArg выше. Я использую Spring Boot 1.4.2 с Hibernate 5. А именно
Для дополнительной информации я публикую трассировку вызовов, чтобы было понятно, какие вызовы Spring делает в Hibernate для настройки стратегии именования.
источник
teteArg , большое вам спасибо. Просто дополнительная информация, чтобы каждый, кто столкнулся с этим вопросом, мог понять, почему.
То, что сказал teteArg, указано в общих свойствах Spring Boot: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
По-видимому, spring.jpa.hibernate.naming.strategy не является поддерживаемым свойством для реализации Spring JPA с использованием Hibernate 5.
источник
Оказывается, мне просто нужно преобразовать
@column
имя testName во все маленькие буквы, так как изначально оно было в верблюжьем регистре.Хотя я не смог воспользоваться официальным ответом, этот вопрос помог мне решить мою проблему, дав мне понять, что нужно исследовать.
Изменить:
Для того, чтобы:
источник
Если вы хотите использовать @Column (...), всегда используйте маленькие буквы, даже если ваш фактический столбец БД находится в верблюжьем регистре.
Пример: если ваше фактическое имя столбца БД,
TestName
тогда используйте:Если вам это не нравится, просто измените фактическое имя столбца БД на: test_name
источник
В моем случае аннотация была в методе getter (), а не в самом поле (перенесенном из устаревшего приложения).
Spring игнорирует аннотацию и в этом случае, но не жалуется. Решением было переместить его в поле вместо геттера.
источник