【问题标题】:JPA - delete entry from reference tableJPA - 从参考表中删除条目
【发布时间】:2017-07-01 17:39:03
【问题描述】:

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

我在这里错过了什么?

【问题讨论】:

  • 分享您的super.delete(..) 方法的代码。我们不知道它的作用
  • @Dark 添加了缺少的超级方法
  • 你的方法是在事务中调用的吗?事务是否正确提交?为什么要获取一个实体,提取其 ID,从该 ID 中获取引用(从而取回您最初获得的实体),然后删除该实体,而不是从一开始就删除您拥有的实体?
  • @JBNizet 这是由于应用程序的设置。毫无疑问,有一些重构要做:) 是的,它在事务中被调用并且它被正确提交

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    相关资源
    最近更新 更多