У меня есть 3 объекта Report, GaragingReport и GaragingReportData.
Отчет имеет составной ключ (reportid, userid).GaragingReport расширяет Report и имеет список GaragingReportData в качестве перезапуска OneToMany.
Я пытаюсь выполнить следующий запрос JPARepository, чтобы удалить все отчеты старше 90 дней:
void deleteByCreatedDateBefore(LocalDateTime expiryDate);
Но яя получаю ошибку ограничения, говорящую мне, что внешние ключи не могут быть нулевыми.Я уже установил casecade.ALL и deleteOrphans = true, но все равно не повезло.
Отчет:
@Entity
@IdClass(Report.Keys.class)
@Inheritance(strategy = InheritanceType.JOINED)
@OnDelete(action = OnDeleteAction.CASCADE)
@Table(name = "reports", schema = "public")
public class Report {
@Id
@Getter
@Setter
private String id;
@Id
@Getter @Setter
@Column(name="userid")
private String userid;
@Getter @Setter
private String name;
@Getter
@Column(name="created_date")
private LocalDateTime createdDate;
GaragingReport:
@Entity
@Table(name = "garagingreports", schema = "public")
@OnDelete(action = OnDeleteAction.CASCADE)
public class GaragingReport extends Report {
@OneToMany(
cascade = {CascadeType.ALL},
orphanRemoval = true
)
@JoinColumns ({
@JoinColumn(
name = "reportid",
referencedColumnName = "id"),
@JoinColumn(
name = "userid",
referencedColumnName = "userid")
})
@Getter @Setter
private List<GaragingReportData> data = new ArrayList<>();
GaragingReport Data:
@Entity
@IdClass(GaragingReportData.IdClass.class)
@Table(name = "garagingreportdata", schema = "public")
public class GaragingReportData implements CSVSerializable {
private static final int CLUSTER_NUMBERS = 3;
@Id
@Getter @Setter
private String reportid;
@ManyToOne
@JoinColumns({
@JoinColumn(
name = "reportid",
referencedColumnName = "id", insertable = false, updatable = false),
@JoinColumn(
name = "userid",
referencedColumnName = "userid", insertable = false, updatable = false)
})
@Getter @Setter
private GaragingReport report;
@Id
@Getter @Setter
@Column(name = "userid")
private String userid;
@Id
@Getter @Setter
private String domain;
@Getter @Setter
@Column(name="garaging_metric")
private Double garagingMetric;
@Getter @Setter
@Column(name="garaging_distance")
private Double garagingDistance;
@Getter @Setter
@Column(name="strix_location_lat")
private Double strixLocationLat;
@Getter @Setter
@Column(name="strix_location_lng")
private Double strixLocationLng;
@Getter @Setter
@Column(name="strix_address")
private String strixAddress;
@Getter @Setter
@Column(name="estimated_kms")
private Double estimatedKms;
@OneToMany(
cascade = {CascadeType.ALL},
orphanRemoval = true
)
@JoinColumns ({
@JoinColumn(
name = "reportid",
referencedColumnName = "reportid"),
@JoinColumn(
name = "userid",
referencedColumnName = "userid"),
@JoinColumn(
name = "domain",
referencedColumnName = "domain")
})
@Getter @Setter
private List<GaragingReportDataCluster> clusters = new ArrayList<>();
Кроме того, если я пытаюсь удалить одну сущность, я получаю следующее исключение: DataIntegrityViolationException - дубликат ключа.Но я ничего не вставляю, просто repository.delete (отчет)
Спасибо