2016-08-04 34 views
2

Ich habe ein Problem mit der Konvertierung von 1000-01-01 00: 00: 00.0 zu einem LocalDateTime-Objekt. Ich habe bereits die Oracle docs überprüft, um zu sehen, ob vielleicht 1000-01-01 nicht unterstützt wird, aber das scheint nicht das Problem.Hibernate Timestamp zu LocalDateTime Konvertierung unerwartetes Ergebnis

Die Versionen Ich bin Hibernate-Kern mit: 5.2.1.Final
Hibernate-commons-Anmerkungen: 5.0.1.Final
hsqldb: 2.3.4
feder Test-DBUnit: 1.2. 0

Dies ist, wie in MyEntity.class startdate

@Basic 
@Column(name = "start_date", nullable = false) 
public LocalDateTime getstartDate() { 
    return startDate; 
} 

Hibernate sieht schafft es wie folgt aus:

Query:[create table my_table (end_date timestamp not null, start_date timestamp not null)] 

Ich habe einen (Beispiel) Datensatz mit der folgenden Zeile

<my_table startDate="1000-01-01 00:00:00.0" endDate="4000-01-01 00:00:00.0" />

DBUnit wird, um die Daten in einem In-Memory-Datenbank Hibernate

Query:["insert into my_table(START_DATE, END_DATE) values (?, ?)"] 
Params:[(1=1000-01-01 00:00:00.0,2=4000-01-01 00:00:00.0)] 

In meinem JUnit-Test lädt Ich hole die Daten unter Verwendung eines (Hibernate) Entitymanagers und der folgenden benannten Abfrage:

Die Auswahlabfrage (vereinfacht):

Query:["select end_date as date_e12_4_, start_date as date_s13_4_ from my_table mytable0_"] 

In meinem JUnit-Test ich das zurückgegebene Ergebnis behaupten aber ich erhalte eine AssertionError:

java.lang.AssertionError: 
Expected :MyEntity{startDate=1000-01-01T00:00, endDate=4000-01-01T00:00} 
Actual :MyEntity{startDate=1000-01-05T23:09:21, endDate=4000-01-01T00:00} 

Mein startdate 1000-01-01T00: 00 wird 1000-1001 - 05T23: 09: 21.
Das Problem tritt nicht mit dem EndDate auf.

Hat jemand dieses Problem schon einmal gehabt? Oder weiß jemand, wie man es löst? Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. Jede Hilfe wird sehr geschätzt.

Update: es funktioniert, wenn ich LocalDate anstelle von LocalDateTime verwenden.

+0

Welche Engine verwendet die In-Memory-Datenbank? Ist es möglich, dass die Datenbank solche Daten nicht unterstützt? –

+0

Erst seit ich LocalDateTime verwende, ist dieses Problem aufgetreten. Ich habe java.sql.Timestamp vorher ohne Problem benutzt. Die fehlgeschlagenen Tests bestanden bereits während der Timestamp-Periode meines Projekts. –

Antwort

1

Für den neuen Typ von Java 8 benötigen Sie eine andere Abhängigkeit von Hibernate.

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-java8</artifactId> 
    <version>5.0.1.Final</version> 
</dependency> 

Verwenden Sie nach dem Hinzufügen LocalDateTime wie normaler Basistyp.

private LocalDateTime validFrom; 

Aktualisiert Ich versuche, Ihre Situation zu reproduzieren. Hier ist, wie ich die Klasse implementiert.

@Entity 
public class MyTable extends ABaseEntity { 

private LocalDateTime startDate; 

@Type(type="org.hibernate.type.LocalDateTimeType") 
public LocalDateTime getStartDate() { 
    return startDate; 
} 

public void setStartDate(LocalDateTime startDate) { 
    this.startDate = startDate; 
} 

} 

Daten in der Datenbank

ID STARTDATE 
1 25-AUG-16 12.00.00.000000000 AM 

Das Ergebnis, wenn ich

2016-08-25T00:00 

Hoffnung zurückgelesen, das wird helfen!

+0

Zunächst einmal vielen Dank für Ihre Antwort. Ich habe nie erwähnt, dass Hibernate einen Timestamp nicht zu einem LocalDateTime-Objekt analysieren konnte. Das Problem war tatsächlich mit der Zeitzone, denke ich. –