【问题标题】:Deleting relation data with one of the composite keys spring data jpa使用组合键 spring data jpa 之一删除关系数据
【发布时间】:2022-01-27 08:09:01
【问题描述】:

我有具有复合主键的关系实体。

@Getter
@Setter
@Entity
@IdClass(VulnerabilityTargetId.class)
@Table(name = "vulnerabilities_targets")
@Where(clause = "deleted='false'")
@SQLDelete(
    sql =
        "UPDATE vulnerabilities_targets SET deleted = true WHERE target_id = ? and vulnerability_id = ?")
public class VulnerabilityTarget extends BaseRelEntity {

  @Id
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "target_id")
  private Target target;

  @Id
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "vulnerability_id")
  private Vulnerability vulnerability;


  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    VulnerabilityTarget that = (VulnerabilityTarget) o;
    return target.equals(that.target) && vulnerability.equals(that.vulnerability);
  }

  @Override
  public int hashCode() {
    return Objects.hash(target, vulnerability);
  }
}

还有漏洞目标实体。我的 Id 类是:

@Getter
@Setter
@EqualsAndHashCode
public class VulnerabilityTargetId implements Serializable {

  private long vulnerability;
  private long target;

}

顺便说一句,我尝试像这样将目标 ID 添加到 VulnerabilityTarget 实体并得到错误“实体映射中的重复列:com.security.raze.pojo.internal.entity.relation.VulnerabilityTarget_AUD”

@Id
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "target_id", insertable = false, updatable = false)
  private Target target;

@Column(name = "target_id")
private Long targetId;

所以,我想在删除目标时删除所有关系。如何使用 target_id 删除 VulnerabilityTarget? (通过命名查询或使用 cascase remove)

【问题讨论】:

    标签: hibernate jpa spring-data-jpa


    【解决方案1】:

    如果您想要 targetId 基本映射以及目标引用映射,请尝试使用派生 id:

    @Getter
    @Setter
    @Entity
    @IdClass(VulnerabilityTargetId.class)
    @Table(name = "vulnerabilities_targets")
    @Where(clause = "deleted='false'")
    @SQLDelete(
        sql =
            "UPDATE VulnerabilityTarget SET deleted = true WHERE targetId = ? and vulnerabilityId = ?")
    public class VulnerabilityTarget extends BaseRelEntity {
    
      @Id
      @Column(name = "vulnerability_id")
      private Long vulnerabilityId;
    
      @MapsId("vulnerabilityId")
      @ManyToOne(fetch = FetchType.LAZY)
      private Vulnerability vulnerability;
    
      @Id
      @Column(name = "target_id")
      private Long targetId;
    
      @MapsId("targetId")
      @ManyToOne(fetch = FetchType.LAZY)
      private Target target;
    }
    

    您只需更改 VulnerabilityTargetId 以将目标和漏洞属性分别重命名为 targetId 和漏洞 ID。

    【讨论】:

    • 如果我使用@MapsId,我必须手动实现级联操作和孤儿删除功能吗?如果我必须这样做,这将不是一种简洁的方式。
    • 我的漏洞与此关系实体相关,如下所示:@OneToMany(cascade = CascadeType.ALL, mappedBy = "vulnerability", orphanRemoval = true) private ListefficientTargets = new ArrayList( );
    • 顺便说一句,应用此解决方案后,由于休眠环境而引发错误。错误是:实体映射中的重复列:com.security.raze.pojo.internal.entity.relation.VulnerabilityTarget_AUD 列:target_id(应使用 insert="false" update="false" 映射)
    • MapsId 是一个单独的注解,因此不会更改其他多对一操作,例如级联删除等级联选项。如果你设置它们,它们的工作方式是一样的。孤儿删除在任何情况下都没有意义,因为关系与 id 相关联,并且 id 在 JPA 实体中不能更改。对于您的最后一条评论-您为什么要添加联接列?去掉它。 mapsid 的要点在于,它对基本映射和关系映射使用相同的 dB 列,并根据参考中的值进行设置
    • 审核是 JPA 之外的一项单独功能,并解释了错误中的 _AUD 后缀。 Hibernate 审计必须不支持 mapsId,并将其作为两个单独的列进行审计 - 这意味着您必须添加 @NotAudited 注释或一些指示符来帮助它并告诉它如何在两个映射之一上处理它.
    【解决方案2】:

    在对网络进行一些研究后,我找到了一种解决方案,可以对具有复合 ID 的关系表执行删除操作,并且我正在添加作为解决方案。但我认为可能存在比我的解决方案更简洁的方法。

    @Repository
    public interface VulnerabilityTargetRepository
        extends JpaRepository<VulnerabilityTarget, VulnerabilityTargetId> {
      @Transactional
      @Modifying
      @Query(
          value =
              "UPDATE VulnerabilityTarget vt SET vt.deleted = true WHERE vt.target IN (Select t from Target t WHERE t.id = :targetId)")
      void deleteByTargetId(long targetId);
    }
    

    注意:问题的某些部分需要澄清此答案仅说明了 wwe 如何删除具有复合 PK 的关系实体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      相关资源
      最近更新 更多