Проблемы с именем столбца в спящем режиме

@Column(name = "DateOfBirth")
private Date dateOfBirth;

Мне особенно нужен приведенный выше код для создания столбца с именем «DateOfBirth», вместо этого Hibernate предоставляет мне столбец с именем date_of_birth. Как я могу это изменить? Есть ли свойство web.xml? Я наткнулся на DefaultNamingStrategy и ImprovedNamingStrategy, но не знал, как указать тот или иной.

Возможный рабочий день. Если вы назовете его dateofbirth, столбец в БД будет называться так, но имя атрибута должно быть таким же.

OscarRyz 18.12.2008 00:54

Тогда позвольте мне сказать это как ответ :)

OscarRyz 18.12.2008 01:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
29
2
52 071
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Я не уверен на 100%, но разве вам не нужно аннотировать метод get, а не частную переменную?

Я так не думаю? По крайней мере, я могу указать такие вещи, как длина на уровне переменной экземпляра, и они будут соответственно изменять столбцы.

lucas 18.12.2008 00:38

Вы можете комментировать любой из них, но вы должны аннотировать их последовательно. Если вы смешиваете их и аннотируете некоторые заголовки и некоторые геттеры, он найдет один и проигнорирует другой.

Nathan 05.12.2015 14:04

Поместите аннотацию @Column в геттер:

@Column(name = "DateOfBirth")
public Date getDateOfBirth() {
...
}

Вы можете аннотировать поля или методы получения, это не имеет значения. Можете ли вы опубликовать полный файл hibernate.cfg.xml или persistence.xml?

Предлагаемый обходной путь заключался в использовании @Column (name = "dateofbirth"), который работал в моих целях.

Вы хотите сказать, что единственное изменение, которое вы внесли, было в капитализации?

Matt Solnit 18.12.2008 01:24

Ага. Похоже, что виновником была ImprovedNamingStrategy, которая видит имена столбцов в верблюжьем регистре и преобразует их в нижний регистр + подчеркивание. Ошибка или особенность, решать вам.

lucas 18.12.2008 19:54
Ответ принят как подходящий

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

Hibernate использует формат верблюжьего регистра для создания / чтения столбцов базы данных.

У меня была эта проблема раньше. Я работал с устаревшими столбцами, в которых не было места в именах столбцов «имя сотрудника», «имя сотрудника», «расположение отдела». Я ненавижу это, потому что все мои свойства бобов должны были быть без ящика верблюда.

Столбцы базы данных, разделенные знаком «_», будут использоваться для правильного использования camelCase, как вы только что видели.

К вашему сведению: причина вставки подчеркивания, вероятно, связана с тем, что вы используете ImprovedNamingStrategy. Он установлен на вашем объекте Конфигурация. См. Пример здесь ...

Если вам не нужны подчеркивания, вы можете просто не устанавливать стратегию именования или установить для нее значение DefaultNamingStrategy, которое вы обнаружили ранее.

Именно в этом причина этой проблемы. Для меня работает как оберег.

Charles Morin 26.09.2014 18:24

Спасибо, мне очень помогло. Можете ли вы предложить какую-либо ссылку, чтобы увидеть, чего мне будет не хватать при использовании DefaultNamingStrategy вместо улучшенной?

sajal rajabhoj 14.09.2018 12:10

ImprovedNamingStrategy имеет метод addUnderscores (), который вызывается из tableName () и columnName () вы можете реализовать свой собственный класс стратегии именования и переопределить их по своему выбору.

    public class MyOwnNamingStrategy extends ImprovedNamingStrategy {
        @Override
        public String tableName(String tableName) {
        //return addUnderscores(columnName); // skip this
        return columnName; // if you want column name variable name same
        //return changeAsYouWant(columnName); // as name sames
       }
   }

Я бы посоветовал также вызвать "super (tableName)" для любых имен таблиц, которые вам не нужны, ваше специальное соглашение ... возможно

mschmoock 15.10.2012 20:41

Попробуй вставить это

application.properties

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

добавьте свойство ниже в случае весенней загрузки.

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

Раньше это работало, но начиная с spring -boot 2 (2.0.4) и спящего режима 5.2 (5.2.17) это больше не работает. Я отлаживал весь спящий режим, и стратегии именования на самом деле не мешают, но некоторые другие магические действия спящего режима впоследствии выполняют преобразование, добавляя подчеркивания в свойства camlCase. Это действительно отстой, особенно потому, что явный @Column (name = "nameWithCamlCase") не помогает, а спящий режим все еще думает, что он умнее, чем хотел разработчик. Я предполагаю, что это безумие вызывает какая-то последняя проблема соответствия JPA.

Jörg 30.10.2018 14:08

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