2017-09-04 1 views
1

Ich habe in den letzten Monaten mit Spring Data JPA und MYSQL gearbeitet und es war eine recht erfolgreiche und reibungslose Erfahrung. Dort verwende ich java 8 LocalDateTime, um die Datumszeitfelder zu speichern, und die JPA ordnet diese Felder automatisch den mysql tinyblob-Spalten zu.Spring Data JPA mit Java 8 LocalDateTime

Kürzlich wurde ich aufgefordert, einige Daten durch ein Skript dem System hinzuzufügen. Um die Datumszeitspalten zu füllen, habe ich MYSQL TIMESTAMP Variablen erstellt und in tinyblob Spalten eingefügt. System hat jedoch damit begonnen, SerializationException zu beschweren, und die Ursache dafür sind diese konvertierten Datetime-Spalten. dann hatte ich einen Blick auf den Spalten Datum Zeit durch die Anwendung eingefügt wie unten

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

enter image description here

es so aussieht, wenn Sie durch die Anwendung einzufügen, es als eine Art Java Serialisierung eingefügt. Durch ein MySQL-Skript können wir diese Funktionalität jedoch nicht replizieren.

Jetzt habe ich zwei Möglichkeiten. 1) Ich muss einen Weg finden, ein mysql-Skript zu schreiben, um die Datum-Zeit-Spalten ähnlich der Anwendung zu erzeugen. 2) Ich brauche die Frühjahrsdaten JPA-Mapping von TINYBLOB zu einem anderen Datentyp, der MySQL-Skripte

Schätzen Sie Ihre Hilfe

Danke, Keth

EDIT

unterstützen kann sich ändern Nachdem ich die Antworten und Kommentare unten gelesen hatte, konnte ich eine einfache Lösung finden

, wenn Sie Hibe verwenden rnate 5.0+, können Sie fallen in

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

Dann beginnt das System die Local prperties Java 8 Abbildung in zu mysql DATETIME- Spalten

+1

Je nachdem, welche Hibernate Version der Java 8 date time API wird nicht unterstützt und wird anstelle eines Zeitstempels als Binärdatei gespeichert. –

+5

LocalDateTime sollte nicht in Blobs gespeichert werden. Dies macht es unmöglich, das Datum abzufragen, macht es unmöglich, den Wert in irgendetwas anderem als Java zu verwenden, und benötigt viel mehr Speicherplatz als nötig. Aktuelle Versionen von Hibernate unterstützen standardmäßig LocalDateTime als Datum/Zeitstempel (siehe http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#basic-provided). Welche Version von Frühling/Winterschlaf benutzen Sie? –

+3

Überprüfen Sie diese Dependenz, es wird java8 datetime api Unterstützung zum Ruhezustand hinzufügen: http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22org.hibernate%22%20AND%20a%3A%22hibernate- java8% 22 Soweit ich weiß, es ist verfügbar für Hibernate 5 nur –

Antwort

3

Nach JPA 2.1 Local nicht oficially suppoorted (wahrscheinlich in kurzer Zeit JPA 2., 2 wird offiziell sein). Hibernate-5-Unterstützung als ‚vorzeitige Entlassung‘

Tragbare und unterstützt, da JPA 2.0 ist javax.persistence.AttributeConverter, funktioniert sehr gut auf allen JPA-Provider (und macht nichts Schlechtes auf Hibernate 5)

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