2017-12-18 4 views
0

Ich habe ein seltsames Problem, wo die JPA-Zuordnung bei der Konvertierung in einen Zeitstempel fehlschlägt, aber der Wert, den es verwendet, scheint die gesamte Zeile, nicht nur eine Variable.JPA-Zuordnung bei seltsamer Nachricht fehlgeschlagen

Der Fehler ist:

java.sql.SQLException: Value '1988├╗ ├╗├╗├╗├╗├╗├╗0 
07 1234567 wk├╗0├╗├╗├╗├╗├╗            ' can not be represented as java.sql.Timestamp 

, wo der Wert der gesamten Reihe zu sein scheint, mit den meisten der schlechten Zeichen Nullen zu sein. Debug-Protokollierung gibt mir im Moment nicht viel, und ich bin mir nicht sicher, ob es ein Fehler in meiner Mapping-Klasse, Kollationsprobleme oder etwas anderes ist.

MySQL Workbench liest alle Informationen aus der Tabelle korrekt ein. Wenn Sie mysql über den Befehl ausführen, werden alle Daten korrekt ausgegeben. Weder zeigen irgendwelche Sonderzeichen irgendwo.

Eine vereinfachte Version meiner Mapping-Klasse ist:

@Entity 
@Audited 
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 
public class PersonSundry { 

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

    @NotNull 
    @OneToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="person_id", unique=true) 
    private Person person; 

    @ManyToOne(fetch=FetchType.EAGER) 
    private Lookup1 lookup1; 
    @ManyToOne(fetch=FetchType.EAGER) 
    private Lookup2 lookup2; 

    @Lob 
    private String backgroundInfo; 
    private LocalDate dateOfSomething1; 
    private LocalDate dateOfSomething2; 
    private LocalDate dateOfSomething3; 

    // getters and setters 
} 

hat über diese, bevor jemand kommt? Irgendwelche Ideen wo sonst zu suchen?

BEARBEITEN: Die Grundursache stellte sich als eine generische fehlgeschlagene Umwandlung von 00-00-0000 in einen Zeitstempel heraus, aber ich werde die Frage offen lassen, um zu sehen, ob jemand weiß, wo die merkwürdige Fehlermeldung angegeben wurde von einem genauen.

+0

Der Benutzer führt eine Operation aus, und SQL wird an die Datenbank gesendet. Diese SQL wird im JPA-Anbieterprotokoll gedruckt. Warum nicht darauf schauen? – DN1

+0

Haben Sie Java 8-Unterstützung für Hibernate hinzugefügt? Weil JPA 2.1 java 8 date time api nicht sofort unterstützt –

+0

Können Sie den Code zeigen, wie Sie persistieren (wenn Sie in Java bestehen) und die fehlerhafte Zeile (n) finden? Was ist der Datentyp von LocalDate in der Datenbank? – pirho

Antwort

0

Verwenden Sie MYSQL? Versuchen Sie, diesen Verbindungstyp zu verwenden.

Datetimes mit allen Nullkomponenten (0000-00-00 ...) - Diese Werte können in Java nicht zuverlässig dargestellt werden. Connector/J 3.0.x konvertiert sie immer in NULL, wenn sie von einem ResultSet gelesen werden.

Connector/J 3.1 löst standardmäßig eine Ausnahme aus, wenn diese Werte auftreten, da dies das korrekteste Verhalten gemäß den JDBC- und SQL-Standards ist. Dieses Verhalten kann mithilfe der Konfigurationseigenschaft zeroDateTimeBehavior geändert werden. Die zulässigen Werte sind:

Ausnahme (die Standardeinstellung), die eine SQLException mit einem SQLState von S1009 auslöst.

convertToNull, die NULL anstelle des Datums zurückgibt.

Runde, die das Datum auf den nächstgelegenen Wert rundet, der 0001-01-01 ist.

+0

Dieses Handle bewirkt, dass MySQL die Konvertierungen implizit ausführt. Ich möchte jedoch wissen, warum die Fehlermeldung nicht korrekt ist. –

+0

Datetimes mit allen Nullkomponenten (0000-00-00 ...) - Diese Werte können in Java nicht zuverlässig dargestellt werden. Connector/J 3.0.x konvertiert sie immer in NULL, wenn sie von einem ResultSet gelesen werden. Connector/J 3.1 löst standardmäßig eine Ausnahme aus, wenn diese Werte gefunden werden, da dies gemäß den JDBC- und SQL-Standards das korrekteste Verhalten ist.Dieses Verhalten kann mithilfe der Konfigurationseigenschaft zeroDateTimeBehavior geändert werden. – Sirsendu