JPA - 从参考表中删除条目

时间:2017-07-01 17:39:04

标签: java postgresql hibernate jpa many-to-one

我实现了一个包含组和权限的工作台权限系统。 引用表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);
}

我在这里缺少什么?

1 个答案:

答案 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);
        }
    }