我实现了一个包含组和权限的工作台权限系统。
引用表workbench_group_permissions_reference
具有引用,因此我可以轻松地向组添加和删除权限。
添加新的引用条目工作正常,但删除不。我没有收到任何错误,但删除后仍然存在数据库中的引用。我正在使用postgreSQL。
这是我的参考类:
@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);
}
我在这里缺少什么?
答案 0 :(得分:0)
德拉甘的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);
}
}