Java 8 새 날짜 및 시간 API에 대한 JPA 지원
새 프로젝트에 Java 8을 사용하고 있습니다.
Java 8에서 새 날짜 및 시간 API를 사용하려고하지만 JPA 2.1
이 새 날짜 및 시간 API를 완전히 지원 하는지 여부 는 알 수 없습니다.
Java 8의 새로운 날짜 및 시간 API에 대한 JPA의 지원에 대한 경험 / 의견을 공유하십시오.
JPA 2.1에서 Java 8의 새 날짜 및 시간 API를 안전하게 사용할 수 있습니까?
최신 정보:
Hibernate (4.3.5.Final)를 JPA 구현으로 사용하고 있습니다.
JPA 2.1은 Java 1.8 이전에 나온 사양이므로 이에 대한 지원을 요구하지 않습니다. 분명히 일부 구현은 일부 Java 1.8 기능을 지원할 수 있습니다. 일부는 Java 1.8 바이트 코드 (예 : EclipseLink)에 문제가 있습니다. DataNucleus는 내가 사용하는 java.time과 Java 1.8을 지원한다는 것을 알고 있습니다. 지원 수준이 무엇인지 구현을 확인해야합니다.
JPA 2.2가 java.time 유형을 지원하도록 요청되었습니다. https://java.net/jira/browse/JPA_SPEC-63 문제를 참조하십시오.
Hibernate 5.X의 경우
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>${hibernate.version}</version>
</dependency>
과
@NotNull
@Column(name = "date_time", nullable = false)
protected LocalDateTime dateTime;
추가 노력없이 작동합니다. 참조 https://hibernate.atlassian.net/browse/HHH-8844를
최신 정보:
Jeff Morin의 의견을 살펴보십시오. Hibernate 5.2.x부터 충분합니다.
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.1.Final</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-...</artifactId>
<version>4.3.1.RELEASE</version>
</dependency>
https://github.com/hibernate/hibernate-orm/wiki/Migration-Guide---5.2를 참조 하고 Hibernate 5.2를 Spring 프레임 워크 4.x 와 통합 하십시오.
JPA 2.2는 java.time을 지원합니다.
JPA 2.2 지금 지원 LocalDate
, LocalTime
, LocalDateTime
, OffsetTime
와 OffsetDateTime
.
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>javax.persistence-api</artifactId>
<version>2.2</version>
</dependency>
JPA 2.2 구현의 경우 Hibernate 5.2 또는 EclipseLink 2.7을 사용할 수 있습니다.
Hibernate 5는 Duration
, Instant
및 같은 JPA 2.2보다 더 많은 자바 유형을 지원합니다 ZonedDateTime
.
더 많은 정보:
- Thorben Janssen의 JPA 2.2 로 날짜 및 시간 API를 매핑하는 방법
- JPA 2.2의 새로운 기능
- JSR 338 (유지 보수 릴리스)
- JPA 2.2 위키
내 프로젝트에서 Java 8, EclipseLink (JPA 2.1), PostgreSQL 9.3 및 PostgreSQL Driver -Postgresql-9.2-1002.jdbc4.jar을 사용하고 있으며 새 API의 LocalDateTime 변수를 문제없이 사용할 수 있지만 열의 데이터 유형 데이터베이스에 bytea이므로 내가 아는 한 Java 응용 프로그램에서만 읽을 수 있습니다. AttributeConverter를 사용하여 새 클래스를 java.sql.Date로 변환 할 수 있습니다. Java.net 에서이 코드를 찾습니다.
@Converter(autoApply = true)
public class LocalDatePersistenceConverter implements
AttributeConverter {
@Override
public java.sql.Date convertToDatabaseColumn(LocalDate entityValue) {
return java.sql.Date.valueOf(entityValue);
}
@Override
public LocalDate convertToEntityAttribute(java.sql.Date databaseValue) {
return databaseValue.toLocalDate();
}
org.jadira.usertype 을 사용하여 JSR 310 날짜 및 시간 API를 유지할 수 있습니다.
이 예제 프로젝트를 확인하십시오 .
예제 프로젝트에서
@MappedSuperclass
public class AbstractEntity {
@Id @GeneratedValue Long id;
@CreatedDate//
@Type(type = "org.jadira.usertype.dateandtime.threeten.PersistentZonedDateTime")//
ZonedDateTime createdDate;
@LastModifiedDate//
@Type(type = "org.jadira.usertype.dateandtime.threeten.PersistentZonedDateTime")//
ZonedDateTime modifiedDate;
}
나는 이것이 오래된 질문이라는 것을 알고 있지만 도움이 될만한 대체 솔루션을 생각했습니다.
새 java.time. * 클래스를 기존 데이터베이스 유형에 매핑하는 대신 @Transient를 활용할 수 있습니다.
@Entity
public class Person {
private Long id;
private Timestamp createdTimestamp;
@Id
@GeneratedValue
public Long getId() { return id; }
private Timestamp getCreatedTimestamp() {
return createdTime;
}
private void setCreatedTimestamp(final Timestamp ts) {
this.createdTimestamp = ts;
}
@Transient
public LocalDateTime getCreatedDateTime() {
return createdTime.getLocalDateTime();
}
public void setCreatedDateTime(final LocalDateTime dt) {
this.createdTime = Timestamp.valueOf(dt);
}
}
새로운 Java 8 날짜 / 시간 클래스를 사용하는 공용 getter / setter 메소드로 작업하지만, 백그라운드에서 getter / setter는 레거시 날짜 / 시간 클래스로 작업합니다. 엔터티를 유지하면 레거시 날짜 / 시간 속성은 유지되지만 @Transient로 주석이 추가 된 새 Java 8 속성은 유지되지 않습니다.
TIMESTAMP 유형의 경우 다음 변환기를 사용할 수 있습니다.
@Converter(autoApply = true)
public class LocalDateTimeAttributeConverter implements AttributeConverter<LocalDateTime, Timestamp> {
@Override
public Timestamp convertToDatabaseColumn(LocalDateTime datetime) {
return datetime == null ? null : Timestamp.valueOf(datetime);
}
@Override
public LocalDateTime convertToEntityAttribute(Timestamp timestamp) {
return timestamp == null ? null : timestamp.toLocalDateTime();
}
}
DATE 유형의 경우 다음 변환기를 사용할 수 있습니다.
@Converter(autoApply = true)
public class LocalDateAttributeConverter implements AttributeConverter<LocalDate, Date> {
@Override
public Date convertToDatabaseColumn(LocalDate date) {
return date == null ? null : Date.valueOf(date);
}
@Override
public LocalDate convertToEntityAttribute(Date date) {
return date == null ? null : date.toLocalDate();
}
}
TIME 유형의 경우 다음 변환기를 사용할 수 있습니다.
@Converter(autoApply = true)
public class LocalTimeAttributeConverter implements AttributeConverter<LocalTime, Time> {
@Override
public Time convertToDatabaseColumn(LocalTime time) {
return time == null ? null : Time.valueOf(time);
}
@Override
public LocalTime convertToEntityAttribute(Time time) {
return time == null ? null : time.toLocalTime();
}
}
There are Many approach to do , Also It depends to your frame work : If your frame work has on field Converter such spring do such: 1-
@DateTimeFormat(pattern = "dd.MM.yyyy - HH:mm")
private Long createdDate;
here I am using legacy epoch format https://www.epochconverter.com/ epoch is very flexible and accepted format
2- The other ways is to use jpa @PostLoad @PreUpdate @PrePersist
@PostLoad
public void convert() {
this.jva8Date= LocalDate.now().plusDays(1);
}
or use temp one such
@Transient
public LocalDateTime getCreatedDateTime() {
return createdTime.getLocalDateTime();
}
ReferenceURL : https://stackoverflow.com/questions/23718383/jpa-support-for-java-8-new-date-and-time-api
'developer tip' 카테고리의 다른 글
PHP를 사용하여 JSON POST 읽기 (0) | 2021.01.06 |
---|---|
웹 API 2 라우팅-리소스를 찾을 수 없습니다. (0) | 2021.01.06 |
스택 맵 프레임이란? (0) | 2021.01.06 |
Java 8 : 두 ZonedDateTime의 차이 계산 (0) | 2021.01.06 |
값 개체는 데이터베이스에 어떻게 저장됩니까? (0) | 2021.01.06 |