@Column(name = "DateOfBirth")
private Date dateOfBirth;
Мне особенно нужен приведенный выше код для создания столбца с именем «DateOfBirth», вместо этого Hibernate предоставляет мне столбец с именем date_of_birth. Как я могу это изменить? Есть ли свойство web.xml? Я наткнулся на DefaultNamingStrategy и ImprovedNamingStrategy, но не знал, как указать тот или иной.
Тогда позвольте мне сказать это как ответ :)




Я не уверен на 100%, но разве вам не нужно аннотировать метод get, а не частную переменную?
Я так не думаю? По крайней мере, я могу указать такие вещи, как длина на уровне переменной экземпляра, и они будут соответственно изменять столбцы.
Вы можете комментировать любой из них, но вы должны аннотировать их последовательно. Если вы смешиваете их и аннотируете некоторые заголовки и некоторые геттеры, он найдет один и проигнорирует другой.
Поместите аннотацию @Column в геттер:
@Column(name = "DateOfBirth")
public Date getDateOfBirth() {
...
}
Вы можете аннотировать поля или методы получения, это не имеет значения. Можете ли вы опубликовать полный файл hibernate.cfg.xml или persistence.xml?
Предлагаемый обходной путь заключался в использовании @Column (name = "dateofbirth"), который работал в моих целях.
Вы хотите сказать, что единственное изменение, которое вы внесли, было в капитализации?
Ага. Похоже, что виновником была ImprovedNamingStrategy, которая видит имена столбцов в верблюжьем регистре и преобразует их в нижний регистр + подчеркивание. Ошибка или особенность, решать вам.
Вот возможный обходной путь: если вы назовете его dateofbirth, столбец в базе данных будет называться так, но имя атрибута должно быть таким же.
Hibernate использует формат верблюжьего регистра для создания / чтения столбцов базы данных.
У меня была эта проблема раньше. Я работал с устаревшими столбцами, в которых не было места в именах столбцов «имя сотрудника», «имя сотрудника», «расположение отдела». Я ненавижу это, потому что все мои свойства бобов должны были быть без ящика верблюда.
Столбцы базы данных, разделенные знаком «_», будут использоваться для правильного использования camelCase, как вы только что видели.
К вашему сведению: причина вставки подчеркивания, вероятно, связана с тем, что вы используете ImprovedNamingStrategy. Он установлен на вашем объекте Конфигурация. См. Пример здесь ...
Если вам не нужны подчеркивания, вы можете просто не устанавливать стратегию именования или установить для нее значение DefaultNamingStrategy, которое вы обнаружили ранее.
Именно в этом причина этой проблемы. Для меня работает как оберег.
Спасибо, мне очень помогло. Можете ли вы предложить какую-либо ссылку, чтобы увидеть, чего мне будет не хватать при использовании DefaultNamingStrategy вместо улучшенной?
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)" для любых имен таблиц, которые вам не нужны, ваше специальное соглашение ... возможно
Попробуй вставить это
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.
Возможный рабочий день. Если вы назовете его dateofbirth, столбец в БД будет называться так, но имя атрибута должно быть таким же.