Spring Boot OneToMany

Kalito87

Mitglied
Hallo in die Runde,

folgende Konstellation. Ich habe eine n:m-Beziehung zwischen zwei Objekten (Customers und Datasources). Jedoch sind in der Mapping-Tabelle weitere Felder definiert. Daher habe ich neben den beiden Entitys

Java:
package myApp.models;
@Entity
@Table(name = "datasources")
public class Datasource implements Serializable {
    private static final long serialVersionID = 1L;
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    private String name;
    private Integer deleted = 0;

    @OneToMany(mappedBy="datasource")
    private List<CustomerDatasource> customers_datasources = new ArrayList<>();
}

Java:
package myApp.models;
@Entity
@Table(name = "customers")
public class Customer implements Serializable {
    private static final long serialVersionID = 1L;
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    private String name;
    private Integer deleted = 0;

    @OneToMany(mappedBy="customer")
    private List<CustomerDatasource> customers_datasources = new ArrayList<>();
}

eine entsprechende Entity für die Mapping-Tabelle gebaut.

Java:
package myApp.models;

@Entity
@Table(name = "customers_datasources")
public class CustomerDatasource implements Serializable {
private static final long serialSystemVersionID = 1L;
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;


    @ManyToOne
    @JoinColumn(name="customer_id")
private Customer customer;

    @ManyToOne
    @JoinColumn(name="datasource_id")
private Datasource datasource;

    private String comment;

    private Integer deleted = 0;

}

Ich versuche gerade vom Customer-Objekt heraus dem Nutzer eine neue Datenquelle zuzuordnen:

Der Controller-Code sieht so aus:
Java:
@GetMapping("/datasource/{code}")
    public String datasource_add(@PathVariable("code") String code, Model model, RedirectAttributes redirectAttributes) throws JsonProcessingException {

        model.addAttribute("customer", customerRepository.findByCode(code));
        model.addAttribute("datasources", datasourceRepository.findAll());
        model.addAttribute("pageTitle", "Neue Datenquellenzuordnung");

        return "customers/form_datasource";
    }

und Thymeleaf so:
Java:
<form th:action="@{/customers/datasource_save}" method="post" enctype="multipart/form-data" th:object="${customer}"
                style="max-width: 550px; margin: 0 auto">

              <input type="text" th:field="*{id}" />
              <div class="p-3">

                  <div class="form-group row">
                      <label class="col-sm-3 col-form-label" for="dropSV">Systemversion</label>
                      <div class="col-sm-9">
                          <select class="form-control"   id="dropSV" th:field="*{customers_datasources}">
                              <option value="0"></option>
                              <option th:each="datasource : ${datasources}" th:value="${datasource.id}" th:text="${datasource.name}"></option>
                          </select>
                      </div>
                  </div>

                  <div class="text-center">
                      <input type="submit" value="Save" class="btn btn-primary btn-sm mr-2" />
                      <input type="button" value="Cancel" id="btnCancel" class="btn btn-secondary btn-sm" />
                  </div>
              </div>
          </form>

Wenn ich aber nun einen Wert auswähle, auf Speichern klicke und mir das Customer-Objekt anzeigen lasse, bekomme ich folgendes Werte zurück.

{
"id" : 1,
"code" : null,
"name" : null,
"customers_datasources" : [ null ]
}


So richtig kann ich mir nicht erklären, warum die Liste customers_datasources leer ist. Bin ich überhaupt richtig oder muss ich das Ganze anders aufziehen.

Danke und Gruß
Patrick
 
Ich habe eine n:m-Beziehung zwischen zwei Objekten
Zunächst müssen wir mal die Begriffe klären, damit wir die selbe Sprache sprechen. Der Titel lautet:

Spring Boot OneToMany​

aber in der Beschreibung steht dann: n:m-Beziehung - was ManyToMany entspricht!
Was ist jetzt genau gemeint?

und mir das Customer-Objekt anzeigen lasse, bekomme ich folgendes Werte zurück.

{
"id" : 1,
"code" : null,
"name" : null,
"customers_datasources" : [ null ]
}
Wenn ich mir Customer ansehe gibt es überhaupt kein Feld "code"!?
"customers_datasources" ist kein valider Variablename "customerDatasources" - Spring Boot generiert sehr viel Zeug aus Klassen- und Variablenamen, daher ist es wichtig, dass man sich an Code-Konventionen hält. Es könnten unschöne Seiteneffekte entstehen.
Auch Datasource finde ich sehr hässlich, weil das ein technischer Begriff ist. Immer wenn man über Server redet, wird das für Verwirrung sorgen, weil man den Begriff nicht mit einer Entity verbindet und automatisch an etwas anderes denkt.
 
Ich finde, dass das Design nicht so günstig ist.

Ohne JPA würde ich eine Klasse "Customers" haben, die eine Liste der Klasse "Customer" enthält. Dann hätte ich eine Classe "Datasources" mit einer Liste der Klasse "Datasource". Um dem Beispiel gerecht zu werden hätte ich noch eine Klasse"Connections", die eine Liste der Klasse "Connection" hält, wobei jedes Objekt dieser Klasse jeweils einen Verweis auf in Objekt der beiden Klassen "Customer" und "Datasoruce" enthalten würde.

Die Frage: "Welche Datasources werden von Customer x benutzt?" kann die Klasse "Connection" nicht beantworten, obwohl sie ja dafür da ist.
 

Zurück
Oben