2016-07-21 30 views
0

Ich habe ein Problem, weil ich nicht weiß, wie bestimmte Rolle von Benutzer zu entfernen. Dieses Problem ist mit der unidirektionalen Beziehung in der Berechtigungsklasse verbunden. Dies sind nur relevante Code-Snippets.Entfernen von Entity mit unidirektionaler Beziehung @ManyToOne (JPA)

Klasse Person

@Entity 
public class User { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long userId; 

@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="user") 
private Collection<Role> roles; 

Klasse Rolle

@Entity 
public class Role { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long roleId; 

@ManyToOne(fetch=FetchType.LAZY) 
private User user; 

habe ich versucht, spezifische Rolle von Benutzer auf diese Weise

user.getRoles().remove(roleToRemove) 
entityManger.merge(user) 

roleToRemove wurde aus Sammlung gelöscht zu entfernen, aber nicht aus Datebase. (Ich schrieb Test, der abgeschlossen wurde)

Also, ich

hinzugefügt
orphanRemoval = true 

Und zur Zeit ich habe Probleme mit unidirektionalen Beziehung, die in Berechtigungsklasse auftritt. Ich erhalte DatabaseExeption becouse idRole, die ich entfernen möchte, existiert in der Permission-Tabelle.

@Entity 
public class Permission { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long permissionId; 

@ManyToOne(fetch=FetchType.LAZY) 
private Role role; 

Also, meine Frage ist, wie man mit diesem Problem fertig wird.

Antwort

0

Hallo der Benutzer ist nicht der Besitzer der Beziehung Benutzer - Rolle. Sie müssen das besitzende Ende der Beziehung aktualisieren, damit es funktioniert.

Mein Verständnis ist, dass Sie keine Waisenentfernung benötigen.

-1

Dies ist nicht unidirektional - es ist eine bidirektionale Beziehung. Sie müssen beide Seiten Ihrer Benutzer-Rollen-Beziehung pflegen, damit das Objektmodell die Datenbank widerspiegelt. Es ist nur eine gute Übung und vermeidet Probleme wie diese, damit Ihr Code beide Seiten einer Beziehung verwalten kann. Da Sie die Rolle bereits aus der Rollensammlung des Benutzers entfernen, müssen Sie auch den Verweis der Rolle auf den Benutzer aufheben und den Benutzer und die Rolle zusammenführen.

Die besitzende Seite steuert den Fremdschlüssel in der Datenbank, sodass nur 1 Updateanweisung auftritt, die sich auf die Rollenzeile auswirkt, aber Ihr Objektmodell ist mit der Datenbank synchronisiert, wodurch verhindert wird, dass Caches ebenfalls nicht mehr synchron sind.

+0

Haben Sie bemerkt, dass ich dies in meiner Antwort angesprochen habe - "Beziehungsinhaber" und "Aktualisierung der Beziehung von beiden Seiten"? Wenn Sie denken, dass mehr Details benötigt werden, sollten Sie auf meine Antwort geschrieben haben. Das Papageienspiel mit der Verbesserung des Schreibstils zu spielen, finde ich nicht als eine Demonstration des guten Geschmacks. –

+0

Stil und Geschmack sind im Auge des Betrachters, aber Ihre Antwort ist nur halb richtig, da es nicht erwähnt, dass die Rolle zusammengeführt werden muss. Fühlen Sie sich frei, um Ihre Antwort mit mehr Informationen zu aktualisieren, wenn Sie möchten, dass es vollständig und nützlich für Menschen, die ähnliche Probleme auftreten können - Ich werde gerne meins entfernen, wenn Sie alles abdecken. Andernfalls kann das OP die "beste" Antwort entscheiden - schließlich ist dies der Grund, mehrere Antworten auf solchen Seiten zuzulassen. – Chris

+0

Nun, das ist eine schreckliche Wahnvorstellung. Das Zusammenführen an beiden Enden ist 100% un notwendig. http://stackoverflow.com/questions/20068742/jpa-updating-bidirektionale-association Ich denke, dass Sie mir jetzt eine Stimme geben sollten, um Ihre Augen zu öffnen :) –