ManyToMany in Hibernate

Hallo Leute,

sagen wir dass ich USER, Groupund Zwischentabelle USER_GROUP

@Entity
@Table(name = "USER")
public class User{
@ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "USER_GROUP", joinColumns = {
			@JoinColumn(referencedColumnName = "id", name = "user_id") }, inverseJoinColumns = {
					@JoinColumn(referencedColumnName = "id", name = "group_id") })
private Set<Group> groups = new HashSet<Group>();

 }
    )```


```@Entity
@Table(name = "GROUP")
public class Group {

 @ManyToMany(mappedBy = "groups", fetch = FetchType.LAZY)
 private List<User> users= new LinkedList<User>();

}```

also so soweit so gut ich kann serverseitig  alle 3 Tabellen fühlen
wenn ich ein Eintrag in der Gruppe Tabelle lösche , existiert verknüpfung in der USER_GROUP tabelle
Normalerweise soll doch diese Verknüpfung auch gelöscht werden?. Was sollte ich in diesem Fall machen?

Auf eure Hilfe wurde ich mich sehr freuen
Anni

‘wenn ich ein Eintrag in der Gruppe Tabelle lösche’ klingt als würdest du in der DB-Tabelle etwas löschen,
statt in Java mit Hibernate was auch immer genau auszuführen,

warum sollte Hibernate mit so einem Eingriff klar kommen, vielleicht das Löschen in der USER_GROUP-Tabelle übernehmen, falls das dein Wunsch war?
nicht völlig unvorstellbar, aber genauso vertretbar wäre mir Ablehnung jeder Arbeit wegen inkonsistenter DB…


oder sprichst du/ ziehst auch in Betracht, in Java ein Group-Objekt per Session zu löschen?

grundsätzliche Gegenfrage: hast du von Cascade schon gehört?
für mich selber Bedeutung noch nicht ganz klar, nie ausführlich getestet,
aber wenn bei dir im Code nicht vorhanden und mit keinem Wort erwähnt, dann besteht ja anscheinend erstmal eine Lücke, die sich zu füllen lohnt

zwei Links von mir:
JPA Hibernate many-to-many cascading - Stack Overflow
lustigerweise auch mit User + Group, Cascade etwas Thema


und hier lohnend aussehend:


mit Cascade zu allen Standardfällen

macht es sich aber eher leicht, in allen Fällen wird möglichst vorher auf beiden Seiten detailliert selber aufgeräumt, aufwendige Methoden,
das ist sicher auch gutes sauberes Vorgehen, aber eben nicht einfach sagen ‘ein Objekt löschen, Rest macht Hibernate korrekt’

zum Löschen einer ManyToMany-Seite Author vs. Book nur mit Verknüpfungen etwa (Java8-funktional :wink: )

    Author _Mark_Armstrong =
        getByName(session, "Mark Armstrong");
    _Mark_Armstrong.remove();
    session.delete(_Mark_Armstrong);
});

mit remove-Methode in Author:
    public void remove() {
        for(Book book : new ArrayList<>(books)) {
            removeBook(book);
        }
    }
+
   public void removeBook(Book book) {
        books.remove(book);
        book.authors.remove(this);
    }

ob ‘ein Objekt löschen, Rest macht Hibernate korrekt’ geht kann ich nicht beantworten

ich meinte z.B


USER                                      GROUP                    USER_GROUP
--------------                      --------------             -----------------
0                                             0                              0  1
1                                             1                              1  1
2                                             2                              1  2
3

wenn ich jetzt in Group id=2 lösche (hier entferne ich id=2 aber in meine Tabelle wird spalte deleted mir datum versehen) soll doch USER_GROUP tabelle folgendermassen aussehen. Bei mir ist aber die Zeile vorhanden


USER                                      GROUP                    USER_GROUP
--------------                      --------------             -----------------
0                                             0                              0  1
1                                             1                              1  1
2                                                                          
3

nochmal: was hat Hibernate mit deiner DB zu tun?
du kannst 100 Hibernate-Konfigurationen schreiben, andere auf Welt nochmal 1000 dazu,
sofern sie nie mit Strom betrieben werden haben sie keine Wirkung

und selbst wenn du sie (was nicht näher erklärt) auf deine DB laufen läßt,
werden die eher kaum dort Daten korrigieren, nicht auf manuelle DB-Eingriffe, denke ich


innerhalb der DB gibt es Trigger, Beispiel gerade nur für Insert gefunden:
mysql trigger on insert many to many - Stack Overflow

hinsichtlich Löschen wird anscheinend sowieso eher ‘ON DELETE CASCADE’ empfohlen:
sql - Deleting Related Rows in a Many-to-Many Relationship - Stack Overflow
(Antwort weiter unten)
oder auch
Best practice for deleting many-to-many relationships with SQL Server and ASP.NET MVC - Stack Overflow

und sinnvoll erscheinen mir auch Fremdschlüsselbeziehungen, die ohne korrektes Löschen das halbe Löschen verhindern!
FOREIGN KEY REFERENCES usw., in den Links oben teils mit dabei

all das wäre nur DB-Ebene ohne Hibernate,
welches idealerweise damit auch läuft, freilich Frage für sich…

vieles passt allerdings vielleicht nicht zu Sonderlösungen wie Behalten + Löschdatum,
deswegen gibt es ja Programmiersprachen mit erhöhter Mächtigkeit, nicht mehr SQL ausführen, nur Hibernate und Java alles überlassen,
aber im Standard vielleicht auch nicht gut auf Löschdatum-Variante zu sprechen…

konkret kann ich hier leider nix beantworten, nur paar Stichworte genannt und Nachfragen zur Konkretisierung gestellt