2017-09-04 3 views
1

저는 지난 몇 달 동안 Spring Data JPA와 MYSQL을 사용하여 작업 해 왔으며 아주 성공적으로 원활하게 작업 해 왔습니다. 거기에 내가 자바 8 LocalDateTime을 사용하여 날짜 필드를 저장하고 JPA는 자동으로 해당 필드를 mysql tinyblob 열에 매핑합니다.스프링 데이터 Java with Java 8 LocalDateTime

최근에는 스크립트를 통해 시스템에 일부 데이터를 추가해야한다는 요구 사항이 있습니다. 주문 날짜 열을 채우기 위해 MYSQL TIMESTAMP 변수를 만들고 tinyblob 열에 삽입했습니다. 그러나 시스템이 SerializationException을 불평하기 시작했고 그 근본 원인은 변환 된 datetime 열입니다. 은 내가 당신이 응용 프로그램을 통해 삽입 할 때, 그것은 자바 직렬화의 일종으로 삽입 그렇게 보이는 enter image description here

select CAST(drop_off_time AS CHAR(10000) CHARACTER SET utf8) From job 

아래로 응용 프로그램을 통해 삽입 된 날짜 시간 열을 살펴했다. 그러나 mysql 스크립트를 통해 우리는 그 기능을 복제 할 수 없습니다.

이제 두 가지 옵션이 있습니다. 1) 응용 프로그램과 비슷한 날짜 시간 열을 생성하는 mysql 스크립트를 작성하는 방법을 찾아야합니다. 2) 나는 당신의 도움 감사합니다에 TINYBLOB에서

감사합니다, 케스

편집

를 MySQL의 스크립트

을 지원할 수있는 다른 데이터 유형을 스프링 데이터 JPA 매핑을 변경해야 아래 제공된 답변과 의견을 따른 후 간단한 솔루션을 찾을 수있었습니다.

Hibe를 사용하는 경우 rnate 5.0 이상이

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-java8</artifactId> 
    <version>${hibernate.version}</version> 
</dependency> 

에 놓을 수는 그런 시스템이 oficially (아마 JPA 짧은 시간에 suppoorted되지 JPA 2.1 LocalDateTime에 따르면

+1

등 5 Hibernate 지원하는 자바 최대 절전 모드 버전 8 날짜 시간 API는 지원되지 않으며 타임 스탬프 대신 바이너리로 저장됩니다. –

+5

LocalDateTime을 blob에 저장하면 안됩니다. 따라서 날짜를 쿼리 할 수 ​​없으며 Java 이외의 값으로 값을 사용할 수 없으며 필요한 것보다 훨씬 많은 디스크 공간이 필요합니다. 최근 버전의 Hibernate는 Date/timestamp로 저장된 LocalDateTime을 즉시 지원합니다 (http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#basic-provided 참조). 어떤 버전의 스프링/최대 절전 모드를 사용하고 있습니까? –

+3

이 depyendency를 확인하면 최대 절전 모드로 java8 datetime API 지원이 추가됩니다. http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22org.hibernate%22%20AND%20a%3A%22hibernate- java8 % 22 최대 절전 모드 5에서 사용할 수 있다는 것을 알고있는 한 –

답변

3

DATETIME 컬럼 MySQL의에 자바 8 LocalDateTime의 특성 결정을 매핑 시작 2., 2 명은 공식 임). 따라서 '조기 석방'

휴대용 JPA 2.0 javax.persistence.AttributeConverter 때문에 지원이, (최대 절전 모드 5에 나쁜 아무것도하고 있습니다) 모든 JPA 제공자에 아주 잘 작동하지

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