Spring Boot/ OneToMany Relation

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.
 
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.

https://www.baeldung.com/hibernate-one-to-many
https://www.baeldung.com/spring-data-repositories
https://www.baeldung.com/spring-mvc-model-model-map-model-view
 
Zuletzt bearbeitet:
Ich hänge gerade aber beim Einbau bzw. beim Füllen der bidirektionalen OneToMany/ManyToOne-Beziehung mit Daten.
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.


Brauche ich dafür eine weitere Klasse (Stic
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.
 
Zuletzt bearbeitet:
Okay, das habe ich soweit gemacht.
Wie kann ich in meiner View jetzt auf die Attribute Vorname und Nachname von Mitarbeiter zugreifen?
 
12889

wenn ich es so versuche, wird mir in der Liste angezeigt @Mitarbeiter und irgendeine ID dahinter. Also es werden keine Daten des Mitarbeiters angezeigt.
 
HTML:
<body>
    <div class="container-fluid">
        <h1>Projektverwaltung</h1>
    </div>
    <nav th:include="menu::menu"></nav>
    <div class="container-fluid"><h2 th:text="${title}">Willkommen!</h2></div>
    <div class="container-fluid"><p th:text="${message}">Text</p></div>
    <div class="container-fluid">
        <table class="table table-striped table-hover">
            
            <tbody>
                <tr>
                    <th th:if="${edit}"></th>
                    <th th:if="${edit}"></th>
                    <th>Projektstart</th>
                    <th>Projektende</th>
                    <th>Titel</th>
                    <th>Beschreibung</th>
                    <th>Kunde</th>
                    <th>Ansprechpartner</th>
                    <th>Anschrift</th>
                    <th>Mitarbeiter</th>
                    
                </tr>
                <tr th:each="projekt : ${projekte}">
                    <td th:if="${edit}">
                        <a href="edit" th:href="@{~/projekt/edit(id=${projekt.id})}" >
                            <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
                        </a>
                    </td>
                    <td th:if="${edit}">
                        <a href="delete" th:href="@{~/projekt/delete(id=${projekt.id})}">
                            <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
                        </a>
                    </td>
                    <td th:text="${projekt.projektstart}"></td>
                    <td th:text="${projekt.projektende}"></td>
                    <td th:text="${projekt.titel}"></td>
                    <td th:text="${projekt.beschreibung}"></td>
                    <td th:text="${projekt.kunde}"></td>
                    <td th:text="${projekt.ansprechpartner}"></td>
                    <td th:text="${projekt.anschrift}"></td>
                    <td th:text="${projekt.mitarbeiter}"></td>
                </tr>
            </tbody>
        </table>
    </div>
    <div th:include="foot::foot"></div>
</body>
 
Code:
 @RequestMapping(value="/findAll", method=RequestMethod.GET)
    public ModelAndView findAll() {
        ModelAndView mv = new ModelAndView();
        mv.addObject("title", "Projekte");
        mv.addObject("message", "Alle Projekte der Abteilung");
        mv.addObject("projekte", projektDao.findAll());
        mv.addObject("edit", true);
        mv.setViewName("list-projekte");
        return mv;
    }
 
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?
 
Ja, projekt.mitarbeiter ist eine Liste.
Hast du vielleicht ein Beispiel dazu? Ich habe schon in einigen Foren gesucht aber irgendwie keine passenden gefunden...
Dein eigener Code ist ein Beispiel dafür, du iterierst dort über Listen...


Das dachte ich mir, dass das daran liegt dass es kein String ist. Wie und wo muss ich das anpassen?
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?
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben