2017-02-17 4 views
0

Meine Benutzer-> Rollenbeziehungstabelle wurde magisch und zufällig Zeilen daraus gelöscht. Wir können das Problem nicht reproduzieren, aber es passiert in der Produktionsumgebung. Es passiert nur in prod und scheint nur dann zu passieren, wenn viele Leute das System benutzen, was uns zu der Annahme verleitet, dass es sich um ein Nebenläufigkeitsproblem handelt. Unten ist meine definierte Zuordnung.Hibernate JoinTable-Zeilen werden irgendwie zufällig gelöscht

Wir haben nur ein paar Stellen, die Benutzer oder Rollen bearbeiten. Keiner dieser Orte wird das Problem auftreten! Auch kein anderes System arbeitet gegen die Datenbank.

  1. Durch die Anmeldung kann der Benutzer sein letztes Anmeldedatum festlegen oder sperren, wenn er sich zu oft erfolglos anmeldet.
  2. Benutzerverwaltung - Bearbeiten Sie einen Benutzer und Rollen zuweisen. Mit dieser Aktion können Sie Rollen aus der Beziehung hinzufügen oder entfernen, aber durch die Ausführung einer der beiden Aktionen tritt das Problem nicht auf.
  3. Rollenverwaltung - Erstellen oder Bearbeiten einer Rolle, aber Sie können in dieser Schnittstelle keine Benutzer Rollen zuweisen.
  4. Benutzer können ihr eigenes Passwort in einem Datensatz speichert ihrer Benutzer resultierenden ändern

//User.java

@ManyToMany(fetch = FetchType.LAZY) 
@JoinTable(name = "user_roles", joinColumns = { 
@JoinColumn(name = "user_id", referencedColumnName = "id") }, 
      inverseJoinColumns = {@JoinColumn(name = "role_id") }) 
public Set<Role> getRoles() { 
    return this.roles; 
} 

//Role.java

@ManyToMany(fetch = FetchType.LAZY, mappedBy = "roles") 
public Set<User> getUserRoles() { 
    return this.userRoles; 
} 
+0

Ich bekomme immer noch zufällige Löschungen leider ... – chrislhardin

Antwort

2

Basierend auf Ihrem Beschreibung, sollten Sie wahrscheinlich die Join-Spalte Flaum auf Role entfernen und einfach angeben, dass die @ManyToMany(fetch = FetchType.LAZY, mappedBy = "roles").

Auf diese Weise erlauben Sie nicht, dass die Beziehung von beiden Seiten unabhängig verwaltet wird, was wahrscheinlich der Grund für das Auftreten dieses Problems sein könnte.

Es hat nichts mit Nebenläufigkeit zu tun, sondern eine unkorrekte Zuordnung von wem die Beziehung zwischen Benutzern und Rollen besitzt. Im Moment haben Ihre Mappings angegeben, dass beide Seiten es besitzen, also könnte das Ändern eines Role unbeabsichtigte Konsequenzen haben.

+0

Ich überarbeitete den obigen Code, um die Änderungen widerzuspiegeln, die Sie vorgeschlagen haben, aber ich bekomme noch zufällige Löschungen und kann nicht herausfinden, was sie verursacht. Dein Ansatz ist immer noch der beste, aber ich habe immer noch etwas falsches. – chrislhardin

+0

Sind Sie in der Lage, die Orte, an denen Sie Benutzer- und Rollen-Entitäten manipulieren, in Ihre Frage einzubeziehen? Vielleicht könnten wir Ihnen weiterhelfen. Ohne es ist es wirklich schwierig zu helfen, weil wir das Mapping-Problem gelöst haben. – Naros

+0

Es stellte sich heraus, dass es sich um einen obskuren Ort handelte, an dem ich Sammlungen von einer Entität entfernte, bevor ich sie dem Jackson Converter übergab. Hibernate entschied sich, diese Änderung zu speichern, da sie im Kontext einer Sitzung stattfand. Es brauchte viel Zeit und eine Menge Protokollierung, um aufzuspüren. – chrislhardin

Verwandte Themen