Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to map Hibernate entity fields using camelCase to snake_case (underscore) database identifiers

I have database fields in underscore. I have entity fields in camelcase. I can't change either of those.

Is there something, maybe a class level annotation I can use to default entity column name annotations to the camelcase equivalent?

for example, I have an entity like this:

@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;  } 

I dream of this:

@Entity @DatabaseIsUnderscoreAndThisAnnotationConvertsThemToCamelCaseByDefault public class AuthorisationEntity {      private BigDecimal nonRecoverable;      private BigDecimal supplierRecoverable;      private BigDecimal refundAmount;  } 
like image 903
Paul Stanley Avatar asked Sep 05 '14 08:09

Paul Stanley


People also ask

What is naming strategy in hibernate?

Implicit Naming StrategyHibernate uses a logical name to map an entity or attribute name to a table or column name. This name can be customized in two ways: it can be derived automatically by using an ImplicitNamingStrategy or it can be defined explicitly by using annotations.

What is PhysicalNamingStrategy?

PhysicalNamingStrategy. The idea of a PhysicalNamingStrategy is to define custom naming rules without having to hard-code them into the mapping via explicit names. Following is an implementation of PhysicalNamingStrategy to define custom table name and column name.

What is Spring JPA Hibernate naming strategy?

naming. strategy ; Hibernate 5 defines a Physical and Implicit naming strategies. Spring Boot configures SpringPhysicalNamingStrategy by default. This implementation provides the same table structure as Hibernate 4: all dots are replaced by underscores and camel cases are replaced by underscores as well.


1 Answers

You can achieve this using a custom Hibernate naming strategy.

All you need to do is to use the hibernate-types open-source project.

Hibernate 5.2 or later

You need to add the following Maven dependency:

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

And set the following Hibernate configuration property:

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

Hibernate 5.0 and 5.1

You need to add the following Maven dependency:

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

And set the following Hibernate configuration property:

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

Hibernate 4.3

You need to add the following Maven dependency:

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

And set the following Hibernate configuration property:

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

Hibernate 4.2 and 4.1

You need to add the following Maven dependency:

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

And set the following Hibernate configuration property:

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

Testing time

Assuming you have the following entities:

@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 } 

When using the CamelCaseToSnakeCaseNamingStrategy custom naming strategy, Hibernate is going to generate the following database schema using the hbm2ddl tool:

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) ) 

Cool, right?

like image 191
Vlad Mihalcea Avatar answered Oct 05 '22 10:10

Vlad Mihalcea