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.