-->
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.  [ 7 posts ] 
Author Message
 Post subject: Problem mit generiertem Hibernate Tools Code
PostPosted: Thu Jul 10, 2008 9:41 am 
Moin, ich hab da ein Problem.
Ich hab eine Datenbank in der ich Mitarbeiter und Anlagen hinzufügen kann (unter anderem), und dann noch eine n:m Beziehung zwischen diesen beiden Tabellen.
Sinn der Sache ist folgendes: Ein Mitarbeiter KANN an verschiedenen Anlagen arbeiten, er MÖCHTE evtl an irgendeine andere Anlage und er ARBEITET an einer dritten.
Die Datenbank habe ich im DBDesigner erstellt, der macht aus der n:m Beziehung ja eine 1:n Beziehung mit einer Tabelle in der Mitte, mal einfach ausgedrückt ;)
In genau diese Tabelle habe ich noch eine Tabelle "Arbeitstyp" eingehangen, welche nur die drei schon oben angegebenen Werte speichert, arbeitet, kann und möchte.
Der Sinn ist, aus dieser Tabelle kann ich z.B. eine Zeile lesen: 1, 1, 1, Mitarbeiter mit der ID 1 arbeitet an Anlage mit der ID 1 (arbeitet hat die ID 1).

OK, jetzt mal eben der Code, damit klar ist, was ich mache :)

Der Codeabschnitt in der jsp Datei:
Code:
   if (anlagenarbeitet.size() > 0) { // wenn im Formular eine Anlage gewählt wurde
      sessionhalle = util.HibernateUtil
      .getSessionFactory().getCurrentSession();
      Transaction tx = sessionhalle.beginTransaction();
      String sqlquery = "from Anlage a where a.idAnlage = " + anlagenarbeitet.get(0);
      for (int i = 1; i < anlagenarbeitet.size(); i++) {
         sqlquery += " or a.idAnlage = " + anlagenarbeitet.get(i);
      }
      dbanlagearbeitet = sessionhalle
      .createQuery(sqlquery).list();
      tx.commit();
      
      sessionhalle = util.HibernateUtil
      .getSessionFactory().getCurrentSession();
      tx = sessionhalle.beginTransaction();
      sqlquery = "from Arbeitstyp a where a.idArbeitstyp = 1";
      List<db.Arbeitstyp> dbarbeitstyp = sessionhalle
      .createQuery(sqlquery).list();
      tx.commit();
      
      if (dbanlagearbeitet != null) {//Liste der Anlagen aus der Datenbank, an denen der Mitarbeiter arbeitet
         sessionhalle = util.HibernateUtil
         .getSessionFactory().getCurrentSession();
         tx = sessionhalle.beginTransaction();
         session.setAttribute("anlagearbeitet", dbanlagearbeitet);
         for (int i = 0; i < dbanlagearbeitet.size(); i ++) {
            db.MitarbeiterHasAnlage mha = new db.MitarbeiterHasAnlage();
            mha.setArbeitstyp(dbarbeitstyp.get(0));
            mha.setMitarbeiter(dbma);
            mha.setAnlage(dbanlagearbeitet.get(i));
//            db.MitarbeiterHasAnlageId mhaid = new db.MitarbeiterHasAnlageId(dbma.getIdMitarbeiter(), dbanlagearbeitet.get(i).getIdAnlage(), dbarbeitstyp.get(0).getIdArbeitstyp());
            dbma.getMitarbeiterHasAnlages().add(mha);
            sessionhalle.save(mha);//Ist diese Zeile auskommentiert, läuft alles ohne Absturz, allerdings wird dann auch kein Objekt gespeichert ;)
         }
         tx.commit();
      }
   }


OK, jetzt zum Problem, ich erstelle einen neuen Mitarbeiter OHNE die Beziehung zu den Anlagen zu setzen -> alles hervorragend.
Wenn ich jetzt eine Anlage auswähle und das Formular abschicke, dann kriege ich eine org.hibernate.id.IdentifierGenerationException.
Ich soll also eine ID manuell erstellen, ok, machen wir das doch mal. Dazu nehme ich den Kommentar aus der einen auskommentierten Zeile wieder raus. Dann krieg ich eine NullPointerException, weil ja der Mitarbeiter noch nicht existiert und dbma.getIdMitarbeiter() daher null ist.
Jetzt weiß ich nicht, wie ich die Daten in die Datenbank einfügen kann, während ich die Beziehung berücksichtige.
Geht davon aus, dass ansonsten alle Daten vorliegen und auch erfolgreich in der Datenbank landen.


Top
  
 
 Post subject:
PostPosted: Thu Jul 10, 2008 9:54 am 
Newbie

Joined: Thu Nov 29, 2007 7:42 am
Posts: 2
Location: Germany / Cologne
Poste doch mal die Definition der Klasse (bei Annotations) bzw. das Mapping File. Welchen IdGenerator verwendest du?

_________________
--
Hibernate 3.2.5.ga, Annotations 3.3.0 ga


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jul 10, 2008 2:14 pm 
Hm, weiß ich so garnicht, ich lasse die Klassen mittels Hibernate Tools erstellen. Ich kann da morgen erst auf Arbeit genau nachschauen.


Top
  
 
 Post subject:
PostPosted: Thu Jul 10, 2008 4:06 pm 
Regular
Regular

Joined: Fri May 12, 2006 4:05 am
Posts: 106
Hallo,

nur mal so aus rein akademischer Modellierungssicht:
eigentlich hast Du ja 3 Beziehungen zwischen Arbeiter und Maschine:
1.) ...kann arbeiten an...
2.) ...möchte arbeiten an...
3.) ...arbeitet an....
Von der reinen Lehre müsste man also auch im Datenmodell 3 Beziehungen vorsehen, wovon bei jeder die Kardinalitäten zu berücksichtigen sind. Im schlimmsten Fall, wenn alles n:m-Beziehungen sind, würde das eben 3 verschiedene Zwischentabellen bedeuten.
Der andere Ansatz, in dem man die Bezeihungen zwischen Arbeiter und Maschine durch ein Kennzeichen typisiert erscheint da etwas ökonomischer, allerdings kann man diese dann nicht mehr als reinen Beziehungstyp modellieren, sondern muss die Beziehung als eigene Entität betrachte, da sie ja zusätzliche Attribute besitzt.

Gruß

piet


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jul 11, 2008 2:51 am 
Das stimmt, ich hatte das auch schonmal mit 3 Beziehungen, aber die jetzige Lösung erschien mir irgendwie besser. Wobei ich natürlich auch nochmal die Tabellen im DB Designer umbenennen könnte...
Ich glaub, das mach ich, das ist wesentlich einfacher als jetzt so ein rumgewurschtel ;)


Top
  
 
 Post subject:
PostPosted: Fri Jul 11, 2008 3:06 am 
OK, ich hab das jetzt geändert und noch eine Frage.
Ich generiere mir ja die Datenbank über den DB Designer und lasse dann Hibernate Tools die Java Klassen erstellen. Funktioniert soweit super.
Aus der 3-fachen Mitarbeiter -> Anlage n:m Beziehung legt Hibernate bei den Mitarbeitern mehrere HashSets an, anlages, anlages_1, anlages_2.
Wie kann ich sicher sein, dass ein bestimmtes Hashset immer auf die gleiche Beziehung zeigt? Z.B. dass anlages_1 IMMER auf Mitarbeiter KANN an Anlage arbeiten zeigt?
Weil wenn das immer wild durcheinandergewürfelt wird, dann kann ich das ja nicht einsetzen. Nach einer Änderung bzw Neugenerierung der Hibernate Klassen wäre dann ja die Anwendung an der Stelle nutzlos da die Beziehungen vertauscht wären.


Top
  
 
 Post subject:
PostPosted: Fri Jul 11, 2008 5:18 am 
OK, also mal aktueller Stand. Ich hab wieder die Rolle rückwärts gemacht, das mit dem anlage1, 2 war mir zu unsicher. Also hab ich jetzt wieder eine n:m Beziehung mit einer dritten Tabelle, die die Beziehung klassifiziert. Und jetzt krieg ich auch wieder meine org.hibernate.id.IdentifierGenerationException.
Eine Idee die ich noch hatte wäre, erst den Mitarbeiter anzulegen und danach erst den grade angelegten Mitarbeiter wieder aus der DB auslesen und dann hat man ja die ID.
Aber das ist mir irgendwie zuviel Traffic für die Datenbank und irgendwie wiederstrebt mir das, sowas halte ich für eine unschöne Notlösung.


Top
  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 7 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.