2016-03-26 2 views
1

Ich habe einige Einheiten mit @ManyToMany Beziehung:@ManyToMany Beziehung retten nicht

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
@JoinTable(name = "buses_drivers", 
     joinColumns = @JoinColumn (name = "driver_id_inner", referencedColumnName = "driver_id"), 
     inverseJoinColumns = @JoinColumn (name = "bus_id_inner", referencedColumnName = "bus_id")) 
private List<Bus> buses; 

und

@ManyToMany(mappedBy = "buses", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
private List<Driver> drivers; 

Wenn execute Driver Modell mit einigen Bus Modelle zu speichern, alles ok. Tabellen buses_drivers speichern alle Schlüssel diese Entitäten. Aber beim Speichern Bus Modell mit Treibern, Tabelle ändert sich nicht. Ich denke, Problem mit inverseJoinColmns Mapping.

+0

oder ist das Problem in Ihrem Persistenz-Code? Vielleicht würde es helfen, es zu veröffentlichen? –

Antwort

3

Das ist das erwartete Verhalten. In einer bidirektionalen Viele-zu-Viele-Assoziation muss eine Seite die inverse Seite sein. In Ihrem Fall ist es die Bus Seite, weil es mappedBy enthält:

Das Feld, das die Beziehung besitzt. Erforderlich, es sei denn, die Beziehung ist unidirektional.

Das bedeutet, dass Driver der Besitzer der Assoziation ist und Hibernate diese Seite nur überprüft, wenn die Verknüpfung beibehalten wird.

2

Sie sollten Ihre Beziehungen auf jeden Fall neu gestalten.

Ohne auch nur auf die Probleme mit Ihrem aktuellen Speichern Szenario, mit bidirektionalen @ManyToMany + CascadeType.ALL, Sie sind dazu bestimmt, noch mehr Probleme zu bekommen.

Zum Beispiel wird ein Löschen bus wegen Kaskade, löschen Sie alle seine Treiber, die aufgrund der Kaskade wieder alle Busse gelöscht werden. Sie werden am Ende viel mehr löschen, als Sie wahrscheinlich wollen. Überprüfen Sie auch das SQL, das von diesen Zuordnungen generiert wird. Sie werden wahrscheinlich feststellen, dass es weit davon entfernt ist, ideal zu sein.

Verwandte Themen