How to map camelCase properties to snake_case column names with Hibernate

Introduction

In this article, you are going to learn how to map cameCase entity properties (e.g. phoneNumber) to snake_case column names (e.g. phone_number) using a Hibernate naming strategy.

While you could achieve the same goal with the name attribute of JPA @Column annotation, it’s much more convenient to use a custom Hibernate strategy to apply this naming convention consistently.

Continue reading “How to map camelCase properties to snake_case column names with Hibernate”

How to optimize JPQL and Criteria API query plans with Hibernate Statistics

Introduction

Every entity query, be it JPQL or Criteria API, needs to be parsed and compiled to an AST (Abstract Syntax Tree) in order to generate the associated SQL query. The entity query compilation takes time, as explained in this article so Hibernate provides a QueryPlanCache to store already-compiled plans.

Starting with Hibernate 5.4, the Hibernate Statistics object allows you to monitor the Query Plan Cache and this article will show you how to take advantage of this feature to speed up IN query performance.

Continue reading “How to optimize JPQL and Criteria API query plans with Hibernate Statistics”

How to merge entity collections with JPA and Hibernate

Introduction

In this article, you are going to learn why overwriting entity collections is an anti-pattern and how you can merge collections both effectively and efficiently with JPA and Hibernate.

The reason I decided to write this article is that I’ve been this question asked over and over and over again.

Continue reading “How to merge entity collections with JPA and Hibernate”

How to map java.time.Year and java.time.Month with JPA and Hibernate

Introduction

In this article, we are going to see how you can map the java.time.Year and java.time.Month with both JPA and Hibernate.

As explained in this article, JPA 2.2 supports LocalDate, LocalTime, LocalDateTime, OffsetTime, OffsetDateTime from the java.time package. Hibernate has been supporting the Java 8 Date/Time classes since 5.0 via the hibernate-java8 dependency, but since version 5.2, this dependency was merged with hibernate-core so you get the Duration, Instant and ZonedDateTime types in addition to the ones supported by JPA 2.2.

However, neither JPA nor Hibernate supports the java.time.Year type out-of-the-box. As you will see, adding support for java.time.Year is very easy with both standard JPA or Hibernate.

Continue reading “How to map java.time.Year and java.time.Month with JPA and Hibernate”

How to map the Java YearMonth type with JPA and Hibernate

Introduction

In this article, we are going to see how you can map a java.time.YearMonth with both JPA and Hibernate.

As I explained in this article, JPA 2.2 supports the following Date/Time types introduced in Java 8:

  • java.time.LocalDate
  • java.time.LocalTime
  • java.time.LocalDateTime
  • java.time.OffsetTime
  • java.time.OffsetDateTime

Apart from supporting those, Hibernate supports also:

  • java.time.Duration
  • java.time.Instant
  • java.time.ZonedDateTime

However, neither JPA nor Hibernate support the java.time.YearMonth out-of-the-box. As you will see, adding support for java.time.YearMonth is really straightforward for both standard JPA or Hibernate.

Continue reading “How to map the Java YearMonth type with JPA and Hibernate”