Как отобразить поля сущностей 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
}
}
Итак, выберите стратегию именования, которая соответствует вашим потребностям.