W przypadku tego rodzaju problemów zwykle pomaga podanie wersji sterownika JDBC i używanego dialektu.
W każdym razie rozumiem, że rzeczywiście potrzebujesz następującego mapowania (dla DATE i CZAS):
@Column(name = "READING_DATE")
@Temporal(TemporalType.TIMESTAMP)
private Date readingDate;
A problem, z którym się zmagasz, jest w jakiś sposób związany z szaleństwem wprowadzonym przez Oracle w wersji 9.2, zobacz Co się dzieje z DATE i TIMESTAMP?
(w skrócie, wprowadzili TIMESTAMP
kolumna i zmieniono mapowanie DATE
Typ SQL, przeczytaj FAQ). Istnieje kilka opcji rozwiązania tego problemu (oczywiście zakładam, że używasz TemporalType.TIMESTAMP
mapowanie):
Użyj TIMESTAMP
typ kolumny (Nie mam na myśli TemporalType.TIMESTAMP
tutaj naprawdę mam na myśli typ kolumny po stronie DB). Ale jeśli nie potrzebujesz dokładności nanosekundowej, nie jest to najlepszy wybór.
Lub ustaw oracle.jdbc.V8Compatible=true
tryb zgodności, jako właściwość systemowa lub jako właściwość połączenia:
<property name="hibernate.connection.oracle.jdbc.V8Compatible">true</property>
Tak, możesz ustawić dowolne właściwości połączenia w ten sposób. Z dokumentacji Hibernate:
Lub użyj sterownika Oracle JDBC 11.1 ("naprawili" problem, cofając zmianę). To jest idealne rozwiązanie IMO (V8Compatible
rzeczy są przestarzałe).