Announcement

Collapse
No announcement yet.

Date, MySQL, Hibernate

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Date, MySQL, Hibernate

    Hallo,

    ich entwickle eine Webapplikation mit MySQL Server 5.1. und Hibernate.
    Ich möchte nun in einer Tabelle ein Spalte mit dem Datentyp Date hinzufügen.

    Nun habe ich aber Schwierigkeiten mit dem Erstellen und Speichern eines Datensatzes. Ich habe schon eine Menge gegoogelt und ausprobiert und bin mittlerweile etwas entnervt.

    Folgendes Problem: Ich bekomme drei Strings (year, month, day) und möchte die in meiner Datenbank über Hibernate als Date-Wert speichern.
    Dafür wollte ich eine Date-Variable in meinem Javacode erstellen, aber das klappt nicht so, wie ich mir das vorstelle. Wenn ich java.sql.date verwende und die Date-Werte dann setzen will, bekomme ich immer die Meldung, dass diese Methode veraltet ist. Bei java.util.date sieht es auch nicht viel besser aus. Hier meine bisherigen Versuche:

    Code:
    // java.sql.Date b = new  java.sql.Date(Integer.parseInt(year)-1900,Integer.parseInt(month)-1,Integer.parseInt(day));
    // deprecated
                
    
    java.util.Date date = new java.util.Date();
    long t = date.getTime();
     java.sql.Date sqlDate = new java.sql.Date(t);
        
    //soweit ok, aber das ist ja das aktuelle Datum - ich will selber eins setzen. setDate oder irgendwas in diese Richtung ist aber auch alles veraltet!
    Was muss ich machen, um meine Stringwerte day, month, year als Date-Variable abspeichern zu können??

    Für eine Antwort wäre ich dankbar! :-)

    Gruß, dunas.

  • #2
    Schau mal bei bei java.util.Calendar. Mit deinen Werten day,month, year erstellst du dir ein Calendar-Objekt und kannst dann mit calender.getTime() ein Date-Objekt erfragen.

    Comment


    • #3
      geht das auch mit GregorianCalendar? Hab das andere irgendwie nicht hinbekommen und ich meine in Erinnerung zu haben, dass man GregorianCalendar dem Calendar vorziehen soll...
      Code:
      GregorianCalendar birthday = new GregorianCalendar(Integer.parseInt(year),Integer.parseInt(month),Integer.parseInt(day));
             // Date b = birthday.getTime();
              java.util.Date d = birthday.getTime();
      damit bekomme ich aber nur java.util.Date, java.sql.Date ist nicht möglich. Kann ich das trotzdem in die DB speichern?

      Comment


      • #4
        Sicher geht das auch mit GregorianCalendar. Calendar hat keinen entsprechenden Konstruktor

        Du speicherst doch mit Hibernate eine Entity-Klasse. Dort sollte java.util.Date für eine entprechende Membervariable vorhanden sein
        Zuletzt editiert von Christian Marquardt; 21.01.2011, 14:22.
        Christian

        Comment


        • #5
          ich Idiot, tatsächlich, es ist java.util.Date
          (....)

          wenn ich Daten heraushole und in day, month, year umwandeln wollte, was mache ich dann?
          Ich bekomme ja ein Date Objekt, da kann ich wieder nur getTime() aufrufen. muss ich das dann wieder zu einem GregorianCalendarObjekt machen und dann dort die Daten irgendwie abgreifen?

          Die Funktionen, die ich normalerweise über SQL bei Date-Objekten ausführen könnte, gibt es bei HQL ja nicht, richtig? (Diese ganzen praktischen Sachen... adddate, etc)

          Comment


          • #6
            wenn ich Daten heraushole und in day, month, year umwandeln wollte, was mache ich dann?
            mit new GregorianCalendar() eine neues Objekt anlegen, mit setTime das Dateobjekt aus der DB zuweisen und dann mit dem GregorianCalendar weiterarbeiten.

            Man kann das natürlich in der Entity-Klasse realisieren, in dem man eine Methode getDatumAls GergorianCalendar() einfügt. Nach dem dann die Entity-Klasse mit Werten aus der DB gefüllt wurde, greift man das Datum über diese Methode ab.
            Christian

            Comment


            • #7
              ich würde quasi so damit weiterarbeiten?

              Code:
              java.util.Date birthday = hibernateObjekt.getBirth();
              
              GregorianCalendar birth = new GregorianCalendar();
              birth.setTime(birthday);
                 
              //birth.get(Calendar.YEAR), birth.get(Calendar.MONTH)) usw...?
              die Methode gleich in die hibernate-javaklasse, die die tabelle abbildet einzubauen, wäre natürlich äußerst praktisch, ist das aber eine gängige methode? gibt es da vor- oder nachteile?

              Comment


              • #8
                Hibernate kann beispielweise keine Image-Objekte speichern. Diese müssen in Bytearrays umgesetzt werden. Sehe das als zielführend an, dies in den Entity-Klassen zu tun
                Christian

                Comment


                • #9
                  hm
                  ich habe nun alles gemacht, wie vorgeschlagen, doch da gibt es ein Problem:

                  ich gebe ein:
                  Year: 1970
                  Month: 07
                  Day: 12

                  Umwandlung:
                  Code:
                         GregorianCalendar birthday = new GregorianCalendar(Integer.parseInt(year),Integer.parseInt(month),Integer.parseInt(day));
                  
                          java.util.Date d = birthday.getTime();
                          hibernateObject.setBirth(d);
                  In der Datenbank steht:
                  1970-08-12

                  Sowas blödes. Und noch viel ärgerlicher: Wenn ich das Datum dann raushole und das wieder rückgängig mache (date holen, in calendar umwandeln, werte holen), habe ich wieder das korrekte Ergebnis. Sprich: Angezeigt werden die richtigen Daten. In der DB jedoch sind die falschen.

                  Ich denke, da gibt es jetzt folgende Möglichkeiten:
                  1) So lassen, wie es ist. Ergebnis ist ja korrekt
                  2) Beim Speichern -1 vom Monat abziehen, korrektes Ergebnis wird gespeichert und beim Rausholen wieder +1 aufaddieren. Dafür hätte man dann die korrekten Daten in der DB stehen, was meiner Meinung nach wichtiger wäre.

                  Was sagt ihr dazu? Danke!

                  Comment


                  • #10
                    Code:
                    Calendar birthday = Calendar.getInstance();
                    
                    birthday.set(Calendar.YEAR, Integer.parseInt(year));
                    birthday.set(Calendar.MONTH, Integer.parseInt(month)-1);
                    birthday.set(Calendar.DAY_OF_MONTH, Integer.parseInt(day));
                    Das mit der -1 für Month steht in der javadoc-Doku (siehe Calendar.MONTH). Unschön, aber so ist es bereits seit 10 Jahren ;-) Also verwendest du Möglichkeit 2).
                    Zuletzt editiert von ramon98; 21.01.2011, 16:40.

                    Comment


                    • #11
                      Hallo!

                      Vielen Dank für die Antwort, dann mache ich das so! :-)

                      Thema (wahrscheinlich) erledigt! :-)

                      Comment

                      Working...
                      X