我有關系物體與復合主鍵。
@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)
uj5u.com熱心網友回復:
如果您需要 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 和vulnerabilityId。
uj5u.com熱心網友回復:
在網路上進行了一些研究后,我找到了一種對具有復合 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);
}
注意:問題的某些部分需要澄清此答案僅說明了如何洗掉具有復合 PK 的關系物體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/398759.html
