Warum bekomme ich JdbcSQLException (Nicht-Hex-Zeichen) mit meiner H2-Datenbank / Spring-Boot-Anwendung?

8

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%     
DaFoot 26.10.2016, 12:40
quelle

4 Antworten

10

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 .

    
Patrick 31.10.2016 16:26
quelle
1

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.

%Vor%

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 .

%Vor%

Beispiel-Entität

%Vor%     
Vazgen Torosyan 01.11.2016 08:18
quelle
0

Sie haben den Typ der Spalte für last_grading_date im Ruhezustand nicht angegeben. Sie können verwenden:

%Vor%

Ändere LocalDate class in java.sql.Date wenn das nicht funktioniert.

    
Asoub 31.10.2016 13:40
quelle
0

In meinem Fall (Spring Boot 1.5.10) musste ich nur noch folgendes zum Abschnitt pom.xml properties hinzufügen

%Vor%

Diese Version von Spring Boot verwendet standardmäßig Hibernate 5.0.12.Final

    
ashario 12.02.2018 00:20
quelle