Also die kurze Version, ich vermute, ich habe eine Art von Zeichencodierungsproblem, oder die DB speichert / gibt das Datum in einem Format zurück, das Hibernate / Spring-jpa aus irgendeinem Grund nicht mag.
Aber ich bin jiggered, wenn ich herausfinden kann, was falsch läuft!
Verwenden von Hibernate 5, um J8 LocalDate-Elemente in Entity-Requisiten zu verwenden.
Die Datenbank wird erstellt und die Daten korrekt eingefügt (Sie sehen im Protokollausschnitt unten einen Datumswert zurück).
Protokollschnipsel:
%Vor%Gradle:
%Vor%Entität:
%Vor%Spring boot auto DB-Erstellungsskript-Snippets:
%Vor%Eigenschaften (Das Problem trat vor und nach dem Hinzufügen der folgenden Codierungseigenschaft auf):
%Vor%BEARBEITEN: Nach etwas mehr Graben entdeckte ich, dass "validate" eine Einstellung für die Eigenschaft spring.jpa.hibernate.ddl-auto ist. Also habe ich das probiert.
Ich bekomme jetzt beim Start die folgende Fehlermeldung ...
%Vor%Ich habe es funktioniert, indem ich diese Abhängigkeit in meinem Pom hinzufüge:
%Vor%Ich weiß nicht, warum es nicht out of the box funktioniert, aber mit dieser Abhängigkeit behebt es das Problem.
Ich habe diese Eigenschaft auch unter den Eigenschaften hinzugefügt: <hibernate.version>5.0.5.Final</hibernate.version>
Mein Beispielcode für die Wiedergabe:
Data.sql:
%Vor%application.properties
%Vor%PersonRepository
%Vor%Person
%Vor%Anwendung
%Vor% Ergebnis: 2015-02-20
Ein funktionierendes Beispiel wurde auf GitHub hinzugefügt. Die Demo basiert auf Spring-boot
, Java 8
, Hibernate 5
, maven
und java.time.LocalDate
.
JPA 2.1 wurde vor Java 8 veröffentlicht und die Date and Time API existierte zu diesem Zeitpunkt einfach nicht. Daher kann die Annotation @Temporal nur auf Attribute vom Typ java.util.Date und java.util.Calendar angewendet werden.
Wenn Sie ein Attribut LocalDate
in einer Spalte DATE
oder ein LocalDateTime
in einer Spalte TIMESTAMP
speichern möchten, müssen Sie die Zuordnung zu java.sql.Date
oder java.sql.Timestamp
selbst definieren.
Attributkonverter sind Teil der JPA 2.1-Spezifikation und können daher mit jeder beliebigen JPA 2.1-Implementierung verwendet werden, z. Hibernate oder EclipseLink. Ich habe Wildfly 8.2 mit Hibernate 4.3 für die folgenden Beispiele verwendet.
Konvertieren von LocalDate
Wie Sie im folgenden Codefragment sehen können, müssen Sie nicht viel tun, um einen Attributkonverter für LocalDate zu erstellen.
%Vor% Sie müssen die Schnittstelle AttributeConverter<LocalDate, Date>
mit ihren beiden Methoden convertToDatabaseColumn
und convertToEntityAttribute
implementieren. Wie Sie an den Methodennamen erkennen können, definiert einer von ihnen die Umwandlung vom Typ des Entitätsattributs ( LocalDate
) in den Datenbankspaltetyp ( Date
) und der andere die umgekehrte Konvertierung. Die Konvertierung selbst ist sehr einfach, da java.sql.Date
bereits die Methoden zur Konvertierung von und nach LocalDate
zur Verfügung stellt.
Zusätzlich muss der Attributkonverter mit der Annotation @Converter
kommentiert werden. Aufgrund der optionalen Eigenschaft autoApply = true wird der Konverter auf alle Attribute vom Typ LocalDate angewendet. Sehen Sie hier, wenn Sie die Verwendung des Konverters für jedes Attribut einzeln definieren möchten.
Die Konvertierung des Attributs ist für den Entwickler transparent und das Attribut LocalDate
kann wie jedes andere Entitätsattribut verwendet werden. Sie können es zum Beispiel als Abfrageparameter verwenden.
Konvertieren von LocalDateTime
Der Attributkonverter für LocalDateTime
ist im Grunde gleich. Sie müssen die AttributeConverter<LocalDateTime, Timestamp>
-Schnittstelle implementieren, und der Konverter muss mit der @Converter-Annotation kommentiert werden. Ähnlich wie bei LocalDateConverter
erfolgt die Konvertierung zwischen LocalDateTime
und java.sql.Timestamp
mit den Konvertierungsmethoden von Timestamp
.
Beispiel-Entität
%Vor%Tags und Links java spring-data-jpa hibernate spring-boot h2