2017-07-01 4 views
1

Ich habe ein Workbench-Berechtigungssystem mit Gruppen und Berechtigungen implementiert. Eine Referenztabelle workbench_group_permissions_reference enthält Verweise, so dass ich leicht Berechtigungen zu einer Gruppe hinzufügen und entfernen kann. Das Hinzufügen eines neuen Referenzeintrags funktioniert einwandfrei, das Entfernen jedoch nicht. Ich bekomme keinen Fehler, aber die Referenz existiert nach dem Entfernen immer noch in der Datenbank. Ich benutze postgreSQL.JPA - Eintrag aus der Referenztabelle löschen

Hier ist meine Referenzklasse:

@XmlRootElement 
@Entity 
@Table(name = "workbench_group_permissions_reference", uniqueConstraints = { 
     @UniqueConstraint(columnNames = { "workbenchgroupspermissions_id", "workbench_groups_id" }) }) 
public class WorkbenchGroupPermissionReferenceEntity extends BasicEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @ManyToOne 
    @JoinColumn(name = "workbenchgroupspermissions_id") 
    private WorkbenchPermissionEntity workbenchPermission; 

    @ManyToOne 
    @JoinColumn(name = "workbench_groups_id") 
    private WorkbenchGroupEntity workbenchGroup; 

    /** 
    * Empty constructor to make JPA happy. 
    */ 
    public WorkbenchGroupPermissionReferenceEntity() { 
    } 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public WorkbenchPermissionEntity getWorkbenchPermission() { 
     return workbenchPermission; 
    } 

    public void setWorkbenchPermission(WorkbenchPermissionEntity workbenchPermission) { 
     this.workbenchPermission = workbenchPermission; 
    } 

    public WorkbenchGroupEntity getWorkbenchGroup() { 
     return workbenchGroup; 
    } 

    public void setWorkbenchGroup(WorkbenchGroupEntity workbenchGroup) { 
     this.workbenchGroup = workbenchGroup; 
    } 
} 

Das ist meine Methode remove:

public void deleteWorkbenchGroupPermission(final WorkbenchGroupPermissionReferenceEntity workbenchGroupPermission) { 
    long id = workbenchGroupPermission.getId(); 
    super.delete(WorkbenchGroupPermissionReferenceEntity.class, id); 
} 

Und die super.delete Methode:

protected void delete(final Class<?> type, final Object id) { 
    Object ref = this.em.getReference(type, id); 
    this.em.remove(ref); 
} 

Was ich hier fehlt?

+1

teilen sich den Code für Ihre 'super.delete (..)' Methode. Wir haben keine Ahnung, was es tut – Ranjeet

+1

Könnte der Grund sein: https://stackoverflow.com/questions/34840903/silently-ignored-remove –

+0

@Dark hinzugefügt die fehlende Super-Methode –

Antwort

0

Die link in the comment von Dragan zeigte mir in die richtige Richtung. Ich habe versucht, die Referenz zu löschen, aber die besitzende Entität (WorkbenchGroupEntity) hatte immer noch die Referenz. Was ich tat, um das Problem zu lösen war, zunächst die Referenz aus dem Besitz Einheit zu entfernen und dann die Querverweis Einheit danach entfernen:

WorkbenchGroupPermissionReferenceEntity permissionToRemove = new WorkbenchGroupPermissionReferenceEntity(); 
    for(WorkbenchGroupPermissionReferenceEntity permissionReference : existingGroupPermissions) { 
     Long permissionRefernceId = permissionReference.getId(); 
     if(permissionRefernceId.equals(permissionId)){ 
      permissionToRemove = permissionReference; 
     } else { 
      newGroupPermissions.add(permissionReference); 
     } 
    } 
    workbenchGroupEntity.setWorkbenchGroupPermissions(newGroupPermissions); 
    workbenchGroupControl.updateWorkbenchGroup(workbenchGroupEntity); 
    workbenchGroupPermissionsControl.deleteWorkbenchGroupPermission(permissionToRemove); 

EDIT: Da die Lösung oben erwähnt war der Hauptgrund für Das Löschen funktionierte nicht richtig, ich machte einen weiteren dummen Fehler: Ich habe die ID der Querverweissentität mit der ID der Berechtigungs-ID anstelle der Berechtigungs-ID selbst verglichen, so dass die Referenz nie gefunden wurde.

Aktualisiert Kontrolle:

for (WorkbenchGroupPermissionReferenceEntity permissionReference : existingGroupPermissions) { 
     // here was the mistake 
     Long permissionReferenceId = permissionReference.getWorkbenchPermission().getId(); 
     if (permissionReferenceId.equals(permissionId)) { 
      permissionToRemove = permissionReference; 
     } else { 
      newGroupPermissions.add(permissionReference); 
     } 
    } 
Verwandte Themen