Как отобразить поля сущностей Hibernate с помощью camelCase в идентификаторы базы данных snake_case (underscore)

У меня есть поля базы данных в подчеркивание. У меня есть поля сущностей в Camelcase. Я не могу изменить ни один из них.

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

например, у меня есть такая сущность:

@Entity
public class AuthorisationEntity {

    @Column(name = "non_recoverable")
    private BigDecimal nonRecoverable;

    @Column(name = "supplier_recoverable")
    private BigDecimal supplierRecoverable;

    @Column(name = "refund_amount")
    private BigDecimal refundAmount;

}

Я мечтаю об этом:

@Entity
@DatabaseIsUnderscoreAndThisAnnotationConvertsThemToCamelCaseByDefault
public class AuthorisationEntity {

    private BigDecimal nonRecoverable;

    private BigDecimal supplierRecoverable;

    private BigDecimal refundAmount;

}

5 ответов

Решение

Вы можете использовать стратегию именования hibernate. Такой класс стратегии именования описывает, как генерировать имена баз данных для заданных имен Java.

Увидеть:

пример стратегии именования

второй пример

очень хорошая стратегия присвоения имен оракулам - она ​​превращает верблюда в символ подчеркивания и многое другое

Как я объяснил в этой статье, вы можете достичь этого, используя собственную стратегию именования Hibernate.

Все, что вам нужно сделать, это использовать hibernate-types проект с открытым исходным кодом.

Hibernate 5.2 или позже

Вам необходимо добавить следующую зависимость Maven:

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>

И установите следующее свойство конфигурации Hibernate:

<property name="hibernate.physical_naming_strategy"
          value="com.vladmihalcea.hibernate.type.util.CamelCaseToSnakeCaseNamingStrategy"
/>

Hibernate 5.0 и 5.1

Вам необходимо добавить следующую зависимость Maven:

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-5</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>

И установите следующее свойство конфигурации Hibernate:

<property name="hibernate.physical_naming_strategy"
          value="com.vladmihalcea.hibernate.type.util.CamelCaseToSnakeCaseNamingStrategy"
/>

Hibernate 4.3

Вам необходимо добавить следующую зависимость Maven:

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-43</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>

И установите следующее свойство конфигурации Hibernate:

<property name="hibernate.ejb.naming_strategy"
          value="com.vladmihalcea.hibernate.type.util.CamelCaseToSnakeCaseNamingStrategy"
/>

Hibernate 4.2 и 4.1

Вам необходимо добавить следующую зависимость Maven:

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-4</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>

И установите следующее свойство конфигурации Hibernate:

<property name="hibernate.ejb.naming_strategy"
          value="com.vladmihalcea.hibernate.type.util.CamelCaseToSnakeCaseNamingStrategy"
/>

Время тестирования

Предполагая, что у вас есть следующие объекты:

@Entity(name = "BookAuthor")
public class BookAuthor {

    @Id
    private Long id;

    private String firstName;

    private String lastName;

    //Getters and setters omitted for brevity
}

@Entity(name = "PaperBackBook")
public class PaperBackBook {

    @Id
    @GeneratedValue(
        strategy = GenerationType.SEQUENCE
    )
    private Long id;

    @NaturalId
    private String ISBN;

    private String title;

    private LocalDate publishedOn;

    @ManyToOne(fetch = FetchType.LAZY)
    private BookAuthor publishedBy;

    //Getters and setters omitted for brevity
}

При использовании CamelCaseToSnakeCaseNamingStrategy Пользовательская стратегия именования, Hibernate собирается сгенерировать следующую схему базы данных, используя hbm2ddl инструмент:

CREATE SEQUENCE hibernate_sequence
START WITH 1 INCREMENT BY 1

CREATE TABLE book_author (
    id          BIGINT NOT NULL,
    first_name  VARCHAR(255),
    last_name   VARCHAR(255),
    PRIMARY KEY (id)
)

CREATE TABLE paper_back_book (
    id              BIGINT NOT NULL,
    isbn            VARCHAR(255),
    published_on    DATE, 
    title           VARCHAR(255),
    published_by_id BIGINT, 
    PRIMARY KEY (id)
)

Круто, верно?

У меня возникла та же проблема в приложении загрузки Spring, я безуспешно попытался добавить указанную выше конфигурацию Hibernate в файл свойств Spring, добавил его как java bean, снова безуспешно.

Я использую Hibernate Properties объект, добавив в него конфигурацию гибернации, решила мою проблему:

        protected Properties buildHibernateProperties() {
        Properties hibernateProperties = new Properties();
        hibernateProperties.setProperty("hibernate.implicit_naming_strategy", SpringImplicitNamingStrategy.class.getName());
        hibernateProperties.setProperty("hibernate.physical_naming_strategy", SpringPhysicalNamingStrategy.class.getName());

        return hibernateProperties;
    }

Из режима гибернации5.5.4.Final, новая стратегия является эквивалентом SpringSpringPhysicalNamingStrategy.

The CamelCaseToUnderscoresNamingStrategyзаменяет все точки символами подчеркивания, весь верблюжий регистр символами подчеркивания и создает все имена таблиц в нижнем регистре.

Например,LineItemсущность будет сопоставлена ​​сline_itemстол.

import org.hibernate.cfg.DefaultNamingStrategy;
import org.hibernate.cfg.ImprovedNamingStrategy;

public class NamingStratagyTest {
    public static void main(String[] args) {
        String colName = DefaultNamingStrategy.INSTANCE.columnName("UserName");
        System.out.println(colName); // UserName
        colName = ImprovedNamingStrategy.INSTANCE.columnName("UserName");
        System.out.println(colName);// user_name
    }
}

Итак, выберите стратегию именования, которая соответствует вашим потребностям.

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