-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 
Author Message
 Post subject: Probleme mit java.util.Date und java.sql.Date
PostPosted: Mon Apr 24, 2006 4:34 am 
Newbie

Joined: Mon Apr 24, 2006 4:15 am
Posts: 4
Hi,
da ich jetzt nicht weiter weiß, wende ich mich mit meinem Problem an dieses Forum. Vielleicht hat jemand einen Tipp...

Ich benutze Entities mit Audit-Daten der Klasse java.util.Date. Hier ein Auszug aus meinem Mapping-File:

...
<property
name="createdOn"
column="CREATED_ON"
insert="true"
update="false"
type="org.hibernate.type.DateType">
</property>
...

Schreibe ich Daten in die Datenbank, sorgt Hibernate dafür, dass entsprechende Datums-Angaben in ein DB-taugliches Format konvertiert werden. Als Spaltentyp habe ich in meinem SQL Schema "DATE" eingestellt.

Wenn Hibernate nun Daten aus der DB liest und Instanzen für die Datensätze erzeugt, wird das entsprechende Datum nicht als java.util.Date gesetzt sondern als java.sql.Date.

Dadurch kommt es zu einigen Fehlern in meinen JUnit-Tests.

Kurz: ich gebe Datentypen von java.util.Date an Hibernate, bekomme aber java.sql.Date von Hibernate zurück. Als Backend benutze ich Oracle 10G XE

Kann mir einer von Euch weiterhelfen?

Ich bin für jeden Hinweis dankbar...


Top
 Profile  
 
 Post subject:
PostPosted: Mon Apr 24, 2006 5:41 am 
Expert
Expert

Joined: Tue Dec 07, 2004 6:57 am
Posts: 285
Location: Nürnberg, Germany
probier mal als type
entweder type="java.util.Date" oder type="date"

_________________
Please don't forget to rate


Top
 Profile  
 
 Post subject:
PostPosted: Mon Apr 24, 2006 5:59 am 
Newbie

Joined: Mon Apr 24, 2006 4:15 am
Posts: 4
Hallo Mike,
danke für die Antwort, ich habe das aber auch schon ausprobiert. Das Resultat ist das selbe: alle ausgelesenen Daten sind vom Typ java.sql.Date, wenn ich in dem Mapping File "type=date" setze.

Benutze ich stattdessen "type=java.util.Date" wird dieses Setting schlicht ignoriert; es kommen dann Objekte vom Typ java.sql.Timestamp zurück...

Hast du noch weitere Ideen?


Top
 Profile  
 
 Post subject:
PostPosted: Mon Apr 24, 2006 10:16 am 
Beginner
Beginner

Joined: Thu Apr 21, 2005 5:37 am
Posts: 45
Location: Switzerland
Ich glaube das Problem liegt darin, dass java.util.Date normalerweise auf SQL Timestamp gemappt wird, da das java.util.Date eine Genauigkeit von Millisekunden hat, DATE in SQL aber nur auf den Tag genau ist.
Ein DATE in SQL wird normalerweise auf ein java.sql.Date gemappt.
Die ganzen Datumsgeschichten in Java sind leider ausgesprochen mühsam. Ich bin dabei gelandet, dass ich nur noch java.util.Date und Timestamp in der DB verwende. Das hat aber auch seine Nachteile.


Top
 Profile  
 
 Post subject:
PostPosted: Mon Apr 24, 2006 4:41 pm 
Newbie

Joined: Mon Apr 24, 2006 4:15 am
Posts: 4
Schaut euch mal die Klasse org.hibernate.type.DateType an. Hibernate benutzt diese Klasse wenn im Mapping "type=date" steht. Hier liegt die Ursache meines Problems:

...
public Object get(ResultSet rs, String name) throws SQLException {
return rs.getDate(name);
}
...

Es wird einfach das Datum für die benannte Spalte zurückgegeben, und zwar als java.sql.Date!!!

Hier die Lösung:
1) Neue Klasse schreiben, die das Interface org.hibernate.usertype.UserType implementiert
2) Etliche Methoden müssen implementiert werden, hier die 2 wichtigsten: "nullSafeSet" und "nullSaveGet". "nullSaveSet" bekommt als Parameter ein PreparedStatement und ein Objekt, dass in die DB geschrieben werden soll. Das Objekt wird in meinem Fall einfach gecastet und anschließend setze ich alle Objektattribute für das PreparedStatement. Ich setze hier einfach eine Timestamp, die ich mir aus dem Date-Übergabeparameter herleite. "nullSaveGet" funktioniert genau umgekehrt; diese Methode dient zum Auslesen der Datensätze und zum Erzeugen entsprechender Entity-Klassen. Als Übergabeparameter gibt's hierbei ein Resultset und ein Array mit allen Spaltennamen. Jetzt kann ich aus meinem ResultSet die passende Date-Komponente als Timestamp extrahieren, daraus ein java.util.Date bauen und es anschließend zurückgeben.
3) Im Hibernate-Mapping File muss der entsprechende Eintrag "type=KlasseDieDasUserTypeInterfaceImplementiert" gemacht werden

... vielleicht klingt das alles viel zu kompliziert, vielleicht gibt es ja auch bessere Lösungsansätze... Egal, es funktioniert jetzt jedenfalls ;-)


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.