Hallo zusammen,
ich bin neu in der Java-Welt und soll eine Webanwendung schreiben, in der Mitarbeiter und Projekte angelegt, geändert und gelöscht werden können und man sieht welcher Mitarbeiter in welchem Projekt arbeitet (ManyToOne: Mitarbeiter arbeitet immer nur an einem Projekt, in einem Projekt können mehrere Mitarbeiter arbeiten).
Ich habe den Grundstock bereits in MVC-Architektur umgesetzt. Ich kann Projekte anlegen, ändern und löschen sowie Mitarbeiter anlegen, ändern und löschen.
Ich hänge gerade aber beim Einbau bzw. beim Füllen der bidirektionalen OneToMany/ManyToOne-Beziehung mit Daten.
Wie schaffe ich es, dass beim Anlegen eines Mitarbeiters die Verbindung zur Tabelle Projekt entsteht?
Ich glaube da fehlt es mir einfach am Verständnis.
So oder so solltest du eine zweite Join Tabelle verwenden, denn ich denke mal ein Mitarbeiter kann an mehreren Projekten arbeiten, und ein Projekt wird von n Mitarbeitern bearbeitet.
Danke für die schnelle Antwort.
Ich realisiere das Projekt mit Hibernate/JPA.
Eine 1:N-Beziehung ist ausreichend, weil ein Mitarbeiter nur in einem Projekt arbeitet, in einem Projekt aber mehrere Mitarbeiter arbeiten können.
Mein Problem ist jetzt vor allem, wie ich das Ganze in einer View anzeigen kann und aus der Datenbank hole. Momentan habe ich zwei List-Views. In der ersten werden die Projekte aufgelistet, in der zweiten die Mitarbeiter.
Ich will aber eine Liste mit den Projekten anzeigen mit einer Spalte wie z.B. „Projektmitglieder“ und mir da nur die Vor- und Nachnamen der Mitarbeiter (separiert mit Komma) anzeigen lassen.
Brauche ich dafür eine weitere Klasse (Stichwort DTO) oder wie kann ich das realisieren?
Wenn du deine Entity Klassen erstellt hast, dann kannst du mit Repository (einfach ein Interface vom CrudRepository - Interface) ableiten. Somit hast du verschiedene CRUD Funktionen auf deine Entities. Ob die Daten sofort ermittelt werden sollen oder erst später kannst du für Lazy oder Eager an deiner @MonyToOne bzw. @OneToMany festlegen. Wenn du das hast erstellst du dir einen @Controller annotierte Controller Klasse. Wenn du das hast, dann kannst du z.B. über der Funktion addObject der Klasse ModelView und Rückgabe deiner ModelView die Daten an deine Weboberfläche geben und hier die Daten abfragen.
Gent generell ist es deutlich einfacher, nur unidirectionale Beziehungen zu verwenden. In deinem Fall zB Projekt—>Mitarbeiter, ein Projekt kennt also die Mitglieder, Mitglieder aber nicht direkt die Projekte.
Brauchen nicht, sinnvoll ist es aber oft trotzdem.
allerdings hab ich auch noch nicht ganz verstanden, wo dein Problem liegt.
Beim Modellieren des ganzen um umsetzen des Models in Java-Klassen? Oder beim Nutzen des ganzen mit Spring Data? Oder nur wie man das in der View umsetzt?
Danke für die ausführliche Antwort.
Also, das Anlegen der Java-Klassen mit Beziehung (funktioniert bereits) sowie das Erstellen der CRUD-Repositories habe ich hinbekommen.
Ich habe auch mit thymeleaf mehrere Views erstellt. Bei der View „projekt-list“ werden mir alle Projekte in einer Liste ausgegeben. Bei der View „mitarbeiter-list“ alle Mitarbeiter.
Ich kann auch bereits über die Webanwendung Mitarbeiter sowie Projekte bearbeiten, löschen und hinzufügen. Jetzt ist aber der Punkt erreicht, an dem ich nicht mehr weiterkomme:
1. Ich möchte, dass in der View „projekt-list“ neben den Attributen der Projekte auch die Namen der im Projekt arbeitenden Mitarbeiter angezeigt werden. Also eine zusätzliche Spalte. Wie kann ich das umsetzen? Ebenso wäre meine Vorstellung, dass in der „mitarbeiter-list“ neben den Daten aus der Tabelle Mitarbeiter noch eine Spalte mit dem Namen des Projektes steht, an dem der Mitarbeiter arbeite
2. Ich möchte, dass man bei der Erstellung eines Mitarbeiters/Projekts über die Webanwendung die jeweilige Beziehung herstellen kann. Also, dass man die Zuordnung über die Oberfläche hinbekommt, welcher Mitarbeiter in welchem Projekt arbeitet. Momentan schaffe ich das nur über selbst geschriebene Tests, dann sieht in der DB auch alles richtig aus. Aber ich weiß eben nicht, wie ich das über Benutzereingaben realisieren kann.
Danke schon mal für die Unterstützung. Ich kann abends auch gerne noch Codebeispiele hier einstellen, falls das weiterhilft?
Vllt. ist es aber schon ein wenig klarer geworden.
1. Ich möchte, dass in der View „projekt-list“ neben den Attributen der Projekte auch die Namen der im Projekt arbeitenden Mitarbeiter angezeigt werden. Also eine zusätzliche Spalte. Wie kann ich das umsetzen? Ebenso wäre meine Vorstellung, dass in der „mitarbeiter-list“ neben den Daten aus der Tabelle Mitarbeiter noch eine Spalte mit dem Namen des Projektes steht, an dem der Mitarbeiter arbeite
2. Ich möchte, dass man bei der Erstellung eines Mitarbeiters/Projekts über die Webanwendung die jeweilige Beziehung herstellen kann. Also, dass man die Zuordnung über die Oberfläche hinbekommt, welcher Mitarbeiter in welchem Projekt arbeitet. Momentan schaffe ich das nur über selbst geschriebene Tests, dann sieht in der DB auch alles richtig aus. Aber ich weiß eben nicht, wie ich das über Benutzereingaben realisieren kann.
Füge deiner Entity Projekt ein Container z.B. ArrayList oder HashSet hinzu. Annotiere diese mit @OneToMany(fetch = Eager). Vergesse nicht mit anzugeben was der Fremdkey ist mit anzugeben. Fertig jetzt wird beim laden des Projekts alle User mit in diese Liste eingetragen.
Somit kannst du nachdem du diese an deine Webanwendung z.B. bei Thymleaf diese einfach mit einer Schleife ausgeben.
wenn ich es so versuche, wird mir in der Liste angezeigt @Mitarbeiter und irgendeine ID dahinter. Also es werden keine Daten des Mitarbeiters angezeigt.
wenn ich es so versuche, wird mir in der Liste angezeigt @Mitarbeiter und irgendeine ID dahinter. Also es werden keine Daten des Mitarbeiters angezeigt.
Woher das kommt dürfte dir doch sicher klar sein (Hint: toString)?
Wenn du das sinnvoll formatiert haben willst, musst du das mit Thymeleaf machen. projekt.mitarbeiter ist doch sicherlich eine Liste? Da müsstest du dann drüber iterieren und die Elemente entsprechend anzeigen.
Ja, projekt.mitarbeiter ist eine Liste.
Hast du vielleicht ein Beispiel dazu? Ich habe schon in einigen Foren gesucht aber irgendwie keine passenden gefunden...
Das dachte ich mir, dass das daran liegt dass es kein String ist. Wie und wo muss ich das anpassen?
Wie mrBrown schon feststellte ist projekt.mitarbeiter eine List. Und Listen kannst du in Theamleaf als Iteration durchlaufen lassen https://www.baeldung.com/thymeleaf-iteration
Ja, projekt.mitarbeiter ist eine Liste.
Hast du vielleicht ein Beispiel dazu? Ich habe schon in einigen Foren gesucht aber irgendwie keine passenden gefunden...
Der Hinweis war toString, nicht nur String
Wenn dir das noch nichts sagt, solltest du noch mal 2, 3 Schritte zurück gehen, bevor du dich mit Spring beschäftigst.
Das mit toString habe ich jetzt schon verstanden, danke .
Bei der Iteration durchlaufe ich allerdings nur eine Liste, kann ich da auch zwei Listen durchlaufen?
Vielen Dank euch Beiden, das Ganze funktioniert jetzt soweit.
Eine Frage hätte ich gerade noch:
Wenn ich Mitarbeiter lösche, wird ja automatisch auch der Foreign Key, also die Spalte fk_projekt der Tabelle Mitarbeiter, gelöscht ( die ID der Tabelle Projekt).
Wenn ich aber zuerst ein Projekt lösche, dann bleibt der fk in der Tabelle Mitarbeiter vorhanden, was dann leider zu Problemen führt. Habt ihr dafür einen Tipp
Ich habe im Moment kein Cascade angegeben.
Versucht habe ich es davor bereits mit CascadeType.All (aber dann werden die zugehörigen Mitarbeiter gelöscht, was ja nicht passieren soll) und auch mit @OnDelete(Action=OnDeleteAction.Cascade.
eine letzte Frage habe ich noch:
Ich möchte beim Erstellen eines Mitarbeiters über die Oberfläche ein Projekt zuweisen.
Wie könnte ich das realisieren? Ich brauche ja den fk, also die ID von Projekt...
Ich weiß aber beim Erstellen eines Mitarbeiters nicht, welches Projekt welche ID hat. Wie würdet ihr das lösen?
Vielleicht, dass man bei der Anlage des Mitarbeiters ein Feld Projektname hat und dort eine Liste der verfügbaren Projekte angezeigt wird und man dadurch auswählen kann, welchem Projekt der Mitarbeiter zugeordnet wird?
Vielleicht, dass man bei der Anlage des Mitarbeiters ein Feld Projektname hat und dort eine Liste der verfügbaren Projekte angezeigt wird und man dadurch auswählen kann, welchem Projekt der Mitarbeiter zugeordnet wird?
Ich habe ein Eingabeformular für die verschiedenen Attribute in Thymeleaf erstellt.
Wie kann ich jetzt hier eine Liste von Projektnamen übergeben, aus denen ich auswählen kann?
Die Liste an Projekten wird mir jetzt angezeigt. Allerdings bewirkt die Auswahl nichts. Die ID wird nicht übergeben.
Leider finde ich auch im Netz kaum brauchbare Beispiele.