2017-07-01 107 views
1

我實現了具有組和權限的工作臺權限系統。 參考表workbench_group_permissions_reference有引用,所以我可以輕鬆地添加和刪除組的權限。 添加新的引用條目可以正常工作,但刪除不會。我沒有收到任何錯誤,但刪除後,數據庫中仍存在該引用。我使用的是PostgreSQL。JPA - 從參考表中刪除條目

這裏是我引用類:

@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; 
    } 
} 

這是我的刪除方法:

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

而且super.delete方法:

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

缺少什麼我在這裏?

+1

份額爲你'super.delete(..)'方法的代碼。我們不知道它做什麼 – Ranjeet

+1

可能的原因:https://stackoverflow.com/questions/34840903/silently-ignored-remove –

+0

@Dark添加缺少的超級方法 –

回答

0

Dragan的link in the comment指出我正確的方向。 我試圖刪除引用,但擁有實體(WorkbenchGroupEntity)仍然有引用。 我沒有什麼要解決的問題是首先從擁有實體移除的參照,然後再把刪除交叉引用實體:

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); 

編輯: 正如上面提到的解決方案是爲主要原因刪除工作不正常,我犯了另一個愚蠢的錯誤:我將交叉引用實體的id與權限id的id比較,而不是權限id本身,因此從未找到引用。

更新檢查:

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