Некорректный маппинг в 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 шт):

Автор решения: petrovich

В скобках у аннотации Column вы указываете явно название колонки в базе данных и hibernate будет создавать/искать ее именно под таким именем.

Судя по ошибке вы где-то в другом месте ищете ту же самую колонку уже под другим именем - category_name.

Решение проблемы - в скобках у аннотации Column указать category_name вот так:

@Column(name = "category_name")
→ Ссылка
Автор решения: Streletz

После долгих и трудных попыток всё-таки разобрался сам.

Причина была в том, что при стратегии именования полей по умолчанию 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
→ Ссылка