2017-11-21 5 views
1

Spring 데이터 JPA에서 작업 중이며 LocalDateTime (Java 8)으로 날짜를 지정하는 엔티티를 작성했습니다. DB에 저장하는 동안 실제 날짜가 저장되지 않고 DB에 일부 이진 유형 값이 저장됩니다.LocalDateTime이 데이터베이스에 저장되지 않습니다.

DB에있는 동안 LocalDateTime을 사용해야합니까, 그렇지 않으면이 Java 8 date API를 사용해야합니까?

엔티티 파일 : -

import java.time.LocalDateTime; 

import javax.persistence.Column; 
import javax.persistence.EntityListeners; 
import javax.persistence.MappedSuperclass; 

import org.springframework.data.jpa.domain.support.AuditingEntityListener; 

import lombok.AllArgsConstructor; 
import lombok.Getter; 
import lombok.NoArgsConstructor; 
import lombok.Setter; 

/** 
* 
* @author Ravat 
* 
*/ 

@Getter 
@Setter 
@AllArgsConstructor 
@NoArgsConstructor 
@MappedSuperclass 
@EntityListeners(AuditingEntityListener.class) 
public abstract class BaseEntity { 

    //@CreatedDate 
    @Column(name = "created_date", updatable = false) 
    private LocalDateTime createdDate = LocalDateTime.now(); 

    //@LastModifiedDate 
    @Column(name = "updated_date") 
    private LocalDateTime updatedDate = LocalDateTime.now(); 

} 
+0

게시 방법을 코드 섹션에 게시하십시오. 그것은 우리가 잘못 된 것을 더 잘 이해하는 데 도움이 될 것입니다. –

+0

대신 java.util.Date를 사용하십시오. – cdaiga

+0

이 질문에 도움이 될 수 있습니다 : [최대 절전 모드로 LocalTime을 저장하는 방법] (https://stackoverflow.com/questions/43420970/how-to-store-localtime-in-hibernate/43421511) –

답변

4

참조 링크 How to persist LocalDate and LocalDateTime with JPA

JPA 대신 DATE 또는 TIMESTAMP의 BLOB에 매핑됩니다. 즉, 데이터베이스는 날짜 객체를 인식하지 못하므로 날짜 객체를 최적화 할 수 없습니다. 우리가해야하거나 그렇게하고 싶지 않은 방식입니다.

하지만 그렇다고해서 날짜 및 시간 API를 사용할 수 없다는 의미는 아닙니다. 당신은 당신이 그것을 어떻게 지원할 것인지 결정해야합니다.

TIMESTAMP 열의 DATE 열 또는 LocalDateTime에 LocalDate 특성을 저장하려면 java.sql.Date 또는 java.sql.Timestamp에 매핑을 정의해야합니다.

JPA 2.1의 몇 가지 새로운 기능 중 하나 인 속성 변환기 덕분에이 게시물은 here의 게시물에서 볼 수있는 몇 줄의 코드만으로 구현할 수 있습니다.

예를 들어,

@Converter(autoApply = true) 
public class LocalDateAttributeConverter implements 
AttributeConverter<LocalDate, Date> { 

@Override 
public Date convertToDatabaseColumn(LocalDate locDate) { 
    return (locDate == null ? null : Date.valueOf(locDate)); 
} 

@Override 
public LocalDate convertToEntityAttribute(Date sqlDate) { 
    return (sqlDate == null ? null : sqlDate.toLocalDate()); 
} 
} 

당신은 두 가지 방법 convertToDatabaseColumn 및 convertToEntityAttribute으로 AttributeConverter 인터페이스를 구현해야합니다. 메서드 이름에서 알 수 있듯이 그 중 하나는 엔티티 특성 (LocalDate)의 형식에서 데이터베이스 열 형식 (Date)으로의 변환을 정의하고 다른 하나는 역변환을 정의합니다. java.sql.Date는 이미 LocalDate와의 변환을 수행하는 메소드를 제공하므로 변환 자체는 매우 간단합니다.

또한 속성 변환기에 @Converter 주석을 추가해야합니다. 선택 사항 인 autoApply = true 속성으로 인해 변환기가 LocalDate 유형의 모든 속성에 적용됩니다.

0

감사의 목적이 유일한 이유는 스프링 타임 스탬프 주석을 사용하지 않는 것이 좋습니다.

public abstract class BaseEntity { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

@CreationTimestamp 
@CreatedDate 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "create_date") 
private Date createdAt; 

@UpdateTimestamp 
@LastModifiedDate 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "modify_date") 
private Date updatedAt;