I want to store Date without time into my database. So, I choose to use LocalDate type.
As mentioned in this article, I use a JPA converter to convert
Since this is a very common question, this answer is based on this article I wrote about the best way to map Date and Timestamp with JPA.
JPA 2.2 added support for mapping Java 8 Date/Time API, like LocalDate, LocalTime, LocalDateTime, OffsetDateTime or OffsetTime.
So, let's assume we have the following entity:
@Entity(name = "UserAccount")
@Table(name = "user_account")
public class UserAccount {
@Id
private Long id;
@Column(name = "first_name", length = 50)
private String firstName;
@Column(name = "last_name", length = 50)
private String lastName;
@Column(name = "subscribed_on")
private LocalDate subscribedOn;
//Getters and setters omitted for brevity
}
Notice that the subscribedOn attribute is a LocalDate Java object.
When persisting the UserAccount:
UserAccount user = new UserAccount()
.setId(1L)
.setFirstName("Vlad")
.setLastName("Mihalcea")
.setSubscribedOn(
LocalDate.of(
2013, 9, 29
)
);
entityManager.persist(user);
Hibernate generates the proper SQL INSERT statement:
INSERT INTO user_account (
first_name,
last_name,
subscribed_on,
id
)
VALUES (
'Vlad',
'Mihalcea',
'2013-09-29',
1
)
When fetching the UserAccount entity, we can see that the LocalDate is properly fetched from the database:
UserAccount userAccount = entityManager.find(
UserAccount.class, 1L
);
assertEquals(
LocalDate.of(
2013, 9, 29
),
userAccount.getSubscribedOn()
);
Hibernate 5 supports java 8, so you can add this to your pom.xml:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>5.1.0.Final</version>
</dependency>
This gives you mapping for LocalDate and LocalDateTime out of box.
I think you could write your own Converter, please check an answer: Spring Data JPA - Conversion failed when converting date and/or time from character string
JPA 2.2 supports LocalDate, so no converter is needed.
Hibernate also supports it as of 5.3 version.
Check out this article for more details.
With JPA 2.2, you no longer need to use converter it added support for the mapping of the following java.time types:
java.time.LocalDate
java.time.LocalTime
java.time.LocalDateTime
java.time.OffsetTime
java.time.OffsetDateTime
@Column(columnDefinition = "DATE")
private LocalDate date;
@Column(columnDefinition = "TIMESTAMP")
private LocalDateTime dateTime;
@Column(columnDefinition = "TIME")
private LocalTime localTime;