Некорректный маппинг в Hybernate для поля с именем в стиле СamelCase с заглавной буквы
Есть Entity:
@Entity
@Table(name = "Categories")
public class Category {
private long id;
private String CategoryName;
public Category() {
// TODO Auto-generated constructor stub
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Column(name = "\"CategoryName\"")
public String getCategoryName() {
return CategoryName;
}
public void setCategoryName(String categoryName) {
CategoryName = categoryName;
}
}
Есть таблица Category с именами полей Id и CategoryName соответственно.
При запросе к БД Hibernate выдаёт ошибку, что столбец category_name не найден. Это естественно, т.к. столбец называется немного иначе (см. выше).
Как сделать, чтобы поле CategoryName нормально мапилось в Hibernate?
P.S. Переименовать поле не вариант, т.к. эта БД используется ещё одной системой.
Ответы (2 шт):
В скобках у аннотации Column вы указываете явно название колонки в базе данных и hibernate будет создавать/искать ее именно под таким именем.
Судя по ошибке вы где-то в другом месте ищете ту же самую колонку уже под другим именем - category_name.
Решение проблемы - в скобках у аннотации Column указать category_name вот так:
@Column(name = "category_name")
После долгих и трудных попыток всё-таки разобрался сам.
Причина была в том, что при стратегии именования полей по умолчанию Hibernate автоматически приводит camelCase к snack_case.
Во всяком случае, с SQL Server происходит именно так.
Чтобы этого не было, нужно задать следующие настройки для Hibernate:
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl