2010-02-03 6 views
15

Meine Entitäten enthalten derzeit Java-Datumseigenschaften. Ich fange an, Joda Time für Datumsmanipulation und Berechnungen ziemlich häufig zu verwenden. Das bedeutet, dass ich meine Daten ständig in Joda DateTime-Objekte und wieder zurück konvertieren muss.Persistent Joda DateTime anstelle von Java Datum in Hibernate

Also frage ich mich, gibt es einen Grund, warum ich nicht nur meine Entitäten ändern sollte, um Joda DateTime-Objekte anstelle von Java-Date-Objekten zu speichern?

Bitte beachten Sie, dass diese Entitäten über Hibernate persistiert werden. Ich fand das Projekt jodatime-hibernate, aber ich las auch auf der Joda-Mailingliste, dass es nicht mit neueren Versionen von Hibernate kompatibel war. Und es scheint, dass es nicht sehr gut gepflegt ist.

Also frage ich mich, ob es am besten wäre, einfach weiter zwischen Date und DateTime zu konvertieren, oder wenn es ratsam wäre, persistente DateTime-Objekte zu starten. Mein Anliegen ist, auf eine schlecht gewartete Bibliothek angewiesen zu sein.

Bearbeiten: Beachten Sie, dass eines meiner Ziele ist, Zeitzoneninformationen besser speichern zu können. Wenn Sie nur ein Datum speichern, wird das Datum in der lokalen Zeitzone gespeichert. Da meine Anwendung global verwendet werden kann, muss ich auch die Zeitzone kennen. Joda Time Hibernate scheint dies auch in the user guide zu adressieren.

+3

Zu diesem Zeitpunkt sieht es so aus, als wäre der Benutzertyp für Hibernate die aktuellere und unterstützte Lösung gegenüber dem Joda-Time-Hibernate. Siehe die Antwort von @Chris unten für mehr. – Tauren

+0

+1, ich wunderte mich über genau dasselbe. – Jonik

Antwort

3

Ich denke, die Joda DateTime als Ihre Bean-Eigenschaft Typ ist wahrscheinlich eine gute Idee. Sie können dann Hibernate die Konvertierung durchführen lassen und die Eigenschaft als natives Datenbank-Datumsformat speichern.

Ich habe jodatime-hibernate persönlich verwendet und hatte kein Problem damit (wir verwenden Hibernate 3.2.5GA).

Wenn Sie Bedenken über Jodatime-Winterschlaf haben, können Sie immer Hibernate's custom type mapping mechanism verwenden (was ich sicher bin, ist alles Jodatime-Winterschlaf).

+0

Ich freue mich zu hören, dass Sie joda-time erfolgreich für Bean-Eigenschaften verwenden. Ich benutze Hibernate 3.3, wo es klingt, als ob Leute Probleme haben. Aber ich glaube, du hast Recht, Joda-Zeit ist einfach ein Winterschlaf benutzerdefinierte Art, also vielleicht mit einigen Verbesserungen kann ich es zum Laufen bringen. – Tauren

-4

Datumsangaben sollten nicht mit einem hohen Abstraktionslevel gespeichert werden, wie zB eine Zeichenkette ("2009-08-07 07:43:19 ...") oder als Java-Objekte. Sie sollten seit der Epoche als Millisekunden bestehen bleiben. Sowohl die Joda-Zeit als auch die reguläre Java-Datumszeit können Ihnen die Zeit in Millisekunden seit der Epoche geben. Speichern Sie die Anzahl der verstrichenen Millisekunden und konvertieren Sie sie zurück in Objekte, wenn Sie von Ihrer Datenbank zurücklesen.

Persistierende schwergewichtige Date-Objekte statt einer langen ist ein bisschen wie die Verwendung von Gleitkommazahlen, um Geldbeträge darzustellen: Es ist typischerweise ein riesiger Code-Geruch.

+4

Dies scheint für nicht objektorientierte Benutzer dieser Datenbank nicht sehr hilfreich zu sein. Niemand wäre in der Lage, dieses Schema abzufragen und nach allen heute getätigten Bestellungen abzufragen. Normalerweise stimme ich solchen Ratschlägen zu, aber es scheint mir zu Java und objektzentriert zu sein. – duffymo

+6

Die meisten (alle?) Datenbanken haben Datum Abstraktionen ... –

+0

Ich habe sicherlich darüber nachgedacht, Daten als eine lange (millis seit der Zeit) zu speichern, aber ich würde gerne grundlegende SQL-Abfragen und in der Lage, auch lesbare Daten zu sehen. Außerdem führen einige meiner Abfragen Datumsberechnungen durch, von denen ich nicht glaube, dass die DB mit langen Werten anstelle von Datumswerten umgehen könnte. – Tauren

5

Joda Time Hibernate kann mit den letzten Hibernate-Releases verwendet werden - Sie müssen möglicherweise ein wenig an Ihrem Abhängigkeitsdiagramm (z. B. Einstellungsausschlüsse) anpassen. Kann ich dir auch vorschlagen, den Benutzertyp zu betrachten, den ich auf Sourceforge veröffentlicht habe? Dies bietet Benutzertypen für Joda Time, die das von Ihnen erwähnte Client-Offset-Problem vermeiden sollen. Ich würde mich über jedes Feedback freuen, das Sie zu diesem Projekt haben. https://sourceforge.net/projects/usertype/files/

Grüße Chris.

3

Also, um es zusammenzufassen:

java.util.Datum

  • +   native Unterstützung in Hibernate
  • - schlecht API

Joda-Time

  • +   besser API
  • -  Mangel an native Unterstützung in Hibernate

Persönlich, wenn ich die Domain-Modell halten konnte und „Service-Layer“ sauber von nur einem Dritten Bibliothek (scheinbar User Type for Hibernate in diesem Fall) und die Alternative wäre, einige zusätzliche Code zu schreiben, um die Konvertierung zu tun " manuell "jedes Mal, wenn es nötig war, würde ich mit der Third-Party-Bibliothek gehen.

Verwandte Themen